ultracite 7.5.0 → 7.5.1
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.
- package/dist/index.js +36 -30
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as Qi}from"commander";var d={name:"ultracite",version:"7.5.0",description:"The AI-ready formatter that helps you write and generate code faster.",keywords:["biome","fixer","formatter","linter","ultracite"],homepage:"https://www.ultracite.ai/",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},license:"MIT",author:"Hayden Bleasel <hello@haydenbleasel.com>",repository:{type:"git",url:"git+https://github.com/haydenbleasel/ultracite.git"},bin:{ultracite:"dist/index.js"},files:["config","dist","README.md"],type:"module",exports:{"./oxlint":{types:"./dist/oxlint.d.ts",default:"./dist/oxlint.js"},"./biome/*":"./config/biome/*/biome.jsonc","./eslint/*":"./config/eslint/*/eslint.config.mjs","./oxlint/*":"./config/oxlint/*/index.ts","./oxfmt":"./config/oxfmt/index.ts","./prettier":"./config/prettier/prettier.config.mjs","./stylelint":"./config/stylelint/stylelint.config.mjs","./*":"./config/biome/*/biome.jsonc"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},scripts:{build:"tsup",test:"bun test","test:coverage":"bun test --coverage","check-types":"tsc --noEmit"},dependencies:{"@clack/prompts":"^1.2.0",commander:"^14.0.3","cross-spawn":"^7.0.6",deepmerge:"^4.3.1",glob:"^13.0.6","jsonc-parser":"^3.3.1",nypm:"^0.6.5"},devDependencies:{"@biomejs/biome":"2.4.11","@eslint/js":"^10.0.1","@next/eslint-plugin-next":"^16.2.3","@repo/data":"workspace:*","@tanstack/eslint-plugin-query":"^5.97.0","@types/cross-spawn":"^6.0.6","@types/node":"^25.6.0","@typescript-eslint/eslint-plugin":"^8.58.1","@typescript-eslint/parser":"^8.58.1","@vitest/eslint-plugin":"^1.6.15","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-angular":"^5.0.0","eslint-plugin-astro":"^1.7.0","eslint-plugin-compat":"^7.0.1","eslint-plugin-cypress":"^6.3.0","eslint-plugin-github":"6.0.0","eslint-plugin-html":"^8.1.4","eslint-plugin-import-x":"^4.16.2","eslint-plugin-jest":"^29.15.2","eslint-plugin-jsx-a11y":"^6.10.2","eslint-plugin-n":"^17.24.0","eslint-plugin-prettier":"^5.5.5","eslint-plugin-promise":"^7.2.1","eslint-plugin-qwik":"^1.19.2","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":"^4.0.2","eslint-plugin-storybook":"^10.3.5","eslint-plugin-svelte":"^3.17.0","eslint-plugin-unicorn":"^64.0.0","eslint-plugin-unused-imports":"^4.4.1","eslint-plugin-vue":"^10.8.0",globals:"^17.4.0",oxlint:"^1.59.0","prettier-plugin-svelte":"^3.5.1","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"},peerDependencies:{oxlint:"^1.0.0"},peerDependenciesMeta:{oxlint:{optional:!0}},packageManager:"bun@1.3.12"};import St from"process";import{sync as je}from"cross-spawn";var u=(e,t,o)=>je(e,t,{...o,shell:!1}),Ge=(e,t)=>je(e,[],{...t,shell:!0}),v=(e,t)=>{if(t.error)throw new Error(`Failed to run ${e}: ${t.error.message}`);t.status!==0&&St.exit(t.status??1)};import{access as At,mkdir as zt,readFile as Be,writeFile as Ut}from"fs/promises";import{dirname as De,join as ve}from"path";import It from"process";import{parse as Et}from"jsonc-parser";var m=async e=>{try{return await At(e),!0}catch{return!1}},S=async()=>{if(await m("pnpm-workspace.yaml"))return!0;try{let e=Et(await Be("package.json","utf-8"));return e?!!e.workspaces||!!e.workspace:!1}catch{return!1}},k=async({dependencies:e,devDependencies:t,scripts:o})=>{let i=await Be("package.json","utf-8"),s=JSON.parse(i),r={...s};(s.devDependencies||t)&&(r.devDependencies={...s.devDependencies,...t}),(s.dependencies||e)&&(r.dependencies={...s.dependencies,...e}),(s.scripts||o)&&(r.scripts={...s.scripts,...o}),await Ut("package.json",JSON.stringify(r,null,2))},b=async e=>{let t=De(e);if(t!=="."){let o=t.startsWith("./")?t.slice(2):t;await zt(o,{recursive:!0})}},Tt=["biome.json","biome.jsonc"],jt=["eslint.config.mjs","eslint.config.js","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],Gt=[".oxlintrc.json","oxlint.config.ts"],X=async()=>{let e=It.cwd();for(;;){for(let o of Tt)if(await m(ve(e,o)))return"biome";for(let o of jt)if(await m(ve(e,o)))return"eslint";for(let o of Gt)if(await m(ve(e,o)))return"oxlint";let t=De(e);if(t===e)break;e=t}return null};var Bt=(e,t)=>{let o=["check","--no-errors-on-unmatched",...t];e.length>0?o.push(...e):o.push("./");let i=u("biome",o,{stdio:"inherit"});v("Biome",i)},Dt=(e,t)=>{let o=[...t,...e.length>0?e:["."]],i=u("eslint",o,{stdio:"inherit"});v("ESLint",i)},Pt=(e,t)=>{let o=["--check",...t,...e.length>0?e:["."]],i=u("prettier",o,{stdio:"inherit"});v("Prettier",i)},Ft=(e,t)=>{let o=[...t,...e.length>0?e:["."]],i=u("stylelint",o,{stdio:"inherit"});v("Stylelint",i)},Nt=(e,t)=>{let o=[...t,...e.length>0?e:["."]],i=u("oxlint",o,{stdio:"inherit"});v("Oxlint",i)},Ot=(e,t)=>{let o=["--check",...t,...e.length>0?e:["."]],i=u("oxfmt",o,{stdio:"inherit"});v("oxfmt",i)},Pe=async(e=[],t=[])=>{let o=await X();if(!o)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(o){case"eslint":{await Pt(e,[]),await Dt(e,t),await Ft(e,[]);break}case"oxlint":{await Ot(e,[]),await Nt(e,t);break}default:await Bt(e,t)}};import{existsSync as U}from"fs";import{readFile as te}from"fs/promises";import{join as I}from"path";import E from"process";import{intro as Lt,log as ee,outro as ye,spinner as Rt}from"@clack/prompts";import{parse as Mt}from"jsonc-parser";var $t=[".prettierrc",".prettierrc.js",".prettierrc.cjs",".prettierrc.mjs",".prettierrc.json",".prettierrc.yaml",".prettierrc.yml","prettier.config.js","prettier.config.mjs","prettier.config.cjs"],_t=[".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"],Vt=()=>{let e=u("biome",["--version"],{encoding:"utf-8"});return e.status===0&&e.stdout?{message:`Biome is installed (${String(e.stdout).trim()})`,name:"Biome installation",status:"pass"}:{message:"Biome is not installed or not accessible",name:"Biome installation",status:"fail"}},Wt=()=>{let e=u("eslint",["--version"],{encoding:"utf-8"});return e.status===0&&e.stdout?{message:`ESLint is installed (${String(e.stdout).trim()})`,name:"ESLint installation",status:"pass"}:{message:"ESLint is not installed (optional)",name:"ESLint installation",status:"warn"}},Jt=()=>{let e=u("oxlint",["--version"],{encoding:"utf-8"});return e.status===0&&e.stdout?{message:`Oxlint is installed (${String(e.stdout).trim()})`,name:"Oxlint installation",status:"pass"}:{message:"Oxlint is not installed (optional)",name:"Oxlint installation",status:"warn"}},qt=async()=>{let e=I(E.cwd(),"biome.json"),t=I(E.cwd(),"biome.jsonc"),o=null;if(U(e)?o=e:U(t)&&(o=t),!o)return{message:"No biome.json or biome.jsonc file found",name:"Biome configuration",status:"warn"};try{let i=await te(o,"utf-8"),s=Mt(i);return Array.isArray(s?.extends)&&s.extends.includes("ultracite/biome/core")?{message:"biome.json(c) extends ultracite/biome/core",name:"Biome configuration",status:"pass"}:{message:"biome.json(c) exists but doesn't extend ultracite/biome/core",name:"Biome configuration",status:"warn"}}catch{return{message:"Could not parse biome.json(c) file",name:"Biome configuration",status:"fail"}}},Ht=async()=>{let e=["eslint.config.mjs","eslint.config.js","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],t=null;for(let o of e){let i=I(E.cwd(),o);if(U(i)){t=i;break}}if(!t)return{message:"No eslint.config.* file found (optional)",name:"ESLint configuration",status:"warn"};try{return(await te(t,"utf-8")).includes("ultracite/eslint")?{message:"eslint.config.* imports ultracite/eslint",name:"ESLint configuration",status:"pass"}:{message:"eslint.config.* exists but doesn't import ultracite/eslint",name:"ESLint configuration",status:"warn"}}catch{return{message:"Could not read eslint.config.* file",name:"ESLint configuration",status:"fail"}}},Kt=e=>`./node_modules/ultracite/config/oxlint/${e}`,Qt=async()=>{let e=I(E.cwd(),"oxlint.config.ts");if(!U(e))return{message:"No oxlint.config.ts file found (optional)",name:"Oxlint configuration",status:"warn"};try{return(await te(e,"utf-8")).includes(Kt("core"))?{message:"oxlint.config.ts extends ultracite oxlint config",name:"Oxlint configuration",status:"pass"}:{message:"oxlint.config.ts exists but doesn't extend ultracite config",name:"Oxlint configuration",status:"warn"}}catch{return{message:"Could not read oxlint.config.ts file",name:"Oxlint configuration",status:"fail"}}},Zt=async()=>{let e=I(E.cwd(),"package.json");if(!U(e))return{message:"No package.json found",name:"Ultracite dependency",status:"warn"};try{let t=JSON.parse(await te(e,"utf-8")),o=t.dependencies?.ultracite||t.devDependencies?.ultracite||t.peerDependencies?.ultracite;return o?{message:`Ultracite is in package.json (${o})`,name:"Ultracite dependency",status:"pass"}:{message:"Ultracite not found in package.json dependencies",name:"Ultracite dependency",status:"warn"}}catch{return{message:"Could not parse package.json",name:"Ultracite dependency",status:"warn"}}},Yt=()=>{let e=$t.some(i=>U(I(E.cwd(),i))),o=_t.filter(i=>!i.startsWith("eslint.config")).some(i=>U(I(E.cwd(),i)));if(e||o){let i=[];return e&&i.push("Prettier"),o&&i.push("ESLint (legacy config)"),{message:`Found potentially conflicting tools: ${i.join(", ")}`,name:"Conflicting tools",status:"warn"}}return{message:"No conflicting formatting/linting tools found",name:"Conflicting tools",status:"pass"}},A=async(e,t)=>{let o=Rt();o.start(`Checking ${t}...`);let i=await e();return i.status==="pass"||i.status,o.stop(i.message),i},Fe=async()=>{Lt(`Ultracite v${d.version} Doctor`);let e=[await A(Vt,"Biome installation"),await A(Wt,"ESLint installation"),await A(Jt,"Oxlint installation"),await A(qt,"Biome configuration"),await A(Ht,"ESLint configuration"),await A(Qt,"Oxlint configuration"),await A(Zt,"Ultracite dependency"),await A(Yt,"conflicting tools")],t=e.filter(s=>s.status==="pass").length,o=e.filter(s=>s.status==="fail").length,i=e.filter(s=>s.status==="warn").length;if(ee.info(`Summary: ${t} passed, ${i} warnings, ${o} failed`),o>0)throw ee.error("Some checks failed. Run 'ultracite init' to fix issues."),ye("Doctor complete"),new Error("Doctor checks failed");if(i>0){ee.warn("Some optional improvements available. Run 'ultracite init' to configure."),ye("Doctor complete");return}ee.success("Everything looks good!"),ye("Doctor complete")};var Xt=(e,t)=>{let o=["check","--write","--no-errors-on-unmatched",...t];e.length>0?o.push(...e):o.push("./");let i=u("biome",o,{stdio:"inherit"});v("Biome",i)},e2=(e,t)=>{let o=["--fix",...t,...e.length>0?e:["."]],i=u("eslint",o,{stdio:"inherit"});v("ESLint",i)},t2=(e,t)=>{let o=["--write",...t,...e.length>0?e:["."]],i=u("prettier",o,{stdio:"inherit"});v("Prettier",i)},o2=(e,t)=>{let o=["--fix",...t,...e.length>0?e:["."]],i=u("stylelint",o,{stdio:"inherit"});v("Stylelint",i)},i2=(e,t)=>{let o=t.includes("--unsafe"),i=t.filter(l=>l!=="--unsafe"),s=[o?"--fix-dangerously":"--fix",...i,...e.length>0?e:["."]],r=u("oxlint",s,{stdio:"inherit"});v("Oxlint",r)},s2=(e,t)=>{let o=["--write",...t,...e.length>0?e:["."]],i=u("oxfmt",o,{stdio:"inherit"});v("oxfmt",i)},Ne=async(e,t=[])=>{let o=await X();if(!o)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(o){case"eslint":{await t2(e,[]),await e2(e,t),await o2(e,[]);break}case"oxlint":{await s2(e,[]),await i2(e,t);break}default:await Xt(e,t)}};import Ui from"process";import{cancel as L,intro as Ii,isCancel as R,log as Z,multiselect as Y,select as Ei,spinner as w}from"@clack/prompts";var Oe="./adal-VMG3GLKT.svg";var Le="./aider-K7JLZT2D.svg";var Re="./amazon-q-TSOJNPXB.svg";var Me="./amp-EV4LVL5I.svg";var $e="./augmentcode-Q62PVXKO.svg";var oe="./bob-MRQ23J26.svg";var _e="./claude-6DLEHRDQ.svg";var Ve="./cline-6HWKIYN7.svg";var We="./coder-7BVXO5OJ.svg";var Je="./codex-NQZ5TJCL.svg";var qe="./continue-LKI2ZW3R.svg";var He="./copilot-L2IY45R2.svg";var Ke="./crush-LYLRDQGZ.svg";var ie="./cursor-GQNH5LCA.svg";var Qe="./devin-KY5ISKEW.svg";var Ze="./droid-266OHJBT.svg";var Ye="./firebase-studio-ILLWWYU7.svg";var Xe="./firebender-UNO6LSZG.svg";var e1="./gemini-OYS6V4BH.svg";var t1="./goose-XBIEVD4H.svg";var o1="./jules-HJPVWU73.svg";var i1="./junie-RUWBUV6N.svg";var s1="./kilo-code-4QYUYY2E.svg";var n1="./kimi-6SOFW673.svg";var a1="./langchain-5SXQKAL3.svg";var r1="./lovable-UELF2DY5.svg";var l1="./mcpjam-V2GHUPJN.svg";var c1="./mistral-HQ63EC2B.svg";var d1="./ona-KYYK3HQX.svg";var p1="./open-hands-K5EYKO6T.svg";var m1="./openclaw-XFPF7FMJ.svg";var f1="./opencode-K3274JKQ.svg";var g1="./pi-AZOSKO3D.svg";var u1="./qoder-LPW47DKG.svg";var h1="./qwen-N3D5CQYL.svg";var w1="./replit-WKR4Y6HH.svg";var v1="./roo-code-CVLBTS7D.svg";var y1="./snowflake-S3LTTUXJ.svg";var k1="./vercel-27VSITAQ.svg";var b1="./warp-OZKAAQRT.svg";var x1="./zencoder-VTSK5Z7Z.svg";var se=(e,t)=>`# Ultracite Code Standards
|
|
2
|
+
import{Command as Zi}from"commander";var d={name:"ultracite",version:"7.5.1",description:"The AI-ready formatter that helps you write and generate code faster.",keywords:["biome","fixer","formatter","linter","ultracite"],homepage:"https://www.ultracite.ai/",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},license:"MIT",author:"Hayden Bleasel <hello@haydenbleasel.com>",repository:{type:"git",url:"git+https://github.com/haydenbleasel/ultracite.git"},bin:{ultracite:"dist/index.js"},files:["config","dist","README.md"],type:"module",exports:{"./oxlint":{types:"./dist/oxlint.d.ts",default:"./dist/oxlint.js"},"./biome/*":"./config/biome/*/biome.jsonc","./eslint/*":"./config/eslint/*/eslint.config.mjs","./oxlint/*":"./config/oxlint/*/index.ts","./oxfmt":"./config/oxfmt/index.ts","./prettier":"./config/prettier/prettier.config.mjs","./stylelint":"./config/stylelint/stylelint.config.mjs","./*":"./config/biome/*/biome.jsonc"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},scripts:{build:"tsup",test:"bun test","test:coverage":"bun test --coverage","check-types":"tsc --noEmit"},dependencies:{"@clack/prompts":"^1.2.0",commander:"^14.0.3","cross-spawn":"^7.0.6",deepmerge:"^4.3.1",glob:"^13.0.6","jsonc-parser":"^3.3.1",nypm:"^0.6.5"},devDependencies:{"@biomejs/biome":"2.4.11","@eslint/js":"^10.0.1","@next/eslint-plugin-next":"^16.2.3","@repo/data":"workspace:*","@tanstack/eslint-plugin-query":"^5.97.0","@types/cross-spawn":"^6.0.6","@types/node":"^25.6.0","@typescript-eslint/eslint-plugin":"^8.58.1","@typescript-eslint/parser":"^8.58.1","@vitest/eslint-plugin":"^1.6.15","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-angular":"^5.0.0","eslint-plugin-astro":"^1.7.0","eslint-plugin-compat":"^7.0.1","eslint-plugin-cypress":"^6.3.0","eslint-plugin-github":"6.0.0","eslint-plugin-html":"^8.1.4","eslint-plugin-import-x":"^4.16.2","eslint-plugin-jest":"^29.15.2","eslint-plugin-jsx-a11y":"^6.10.2","eslint-plugin-n":"^17.24.0","eslint-plugin-prettier":"^5.5.5","eslint-plugin-promise":"^7.2.1","eslint-plugin-qwik":"^1.19.2","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":"^4.0.2","eslint-plugin-storybook":"^10.3.5","eslint-plugin-svelte":"^3.17.0","eslint-plugin-unicorn":"^64.0.0","eslint-plugin-unused-imports":"^4.4.1","eslint-plugin-vue":"^10.8.0",globals:"^17.4.0",oxlint:"^1.59.0","prettier-plugin-svelte":"^3.5.1","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"},peerDependencies:{oxlint:"^1.0.0"},peerDependenciesMeta:{oxlint:{optional:!0}},packageManager:"bun@1.3.12"};import At from"process";import{sync as Te}from"cross-spawn";var h=(e,t,o)=>Te(e,t,{...o,shell:!1}),Ge=(e,t)=>Te(e,[],{...t,shell:!0}),v=(e,t)=>{if(t.error)throw new Error(`Failed to run ${e}: ${t.error.message}`);t.status!==0&&At.exit(t.status??1)};import{access as zt,mkdir as Ut,readFile as Be,writeFile as It}from"fs/promises";import{dirname as De,join as ve}from"path";import Et from"process";import{parse as jt}from"jsonc-parser";var m=async e=>{try{return await zt(e),!0}catch{return!1}},S=async()=>{if(await m("pnpm-workspace.yaml"))return!0;try{let e=jt(await Be("package.json","utf-8"));return e?!!e.workspaces||!!e.workspace:!1}catch{return!1}},k=async({dependencies:e,devDependencies:t,scripts:o})=>{let i=await Be("package.json","utf-8"),s=JSON.parse(i),r={...s};(s.devDependencies||t)&&(r.devDependencies={...s.devDependencies,...t}),(s.dependencies||e)&&(r.dependencies={...s.dependencies,...e}),(s.scripts||o)&&(r.scripts={...s.scripts,...o}),await It("package.json",JSON.stringify(r,null,2))},b=async e=>{let t=De(e);if(t!=="."){let o=t.startsWith("./")?t.slice(2):t;await Ut(o,{recursive:!0})}},Tt=["biome.json","biome.jsonc"],Gt=["eslint.config.mjs","eslint.config.js","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],Bt=[".oxlintrc.json","oxlint.config.ts"],X=async()=>{let e=Et.cwd();for(;;){for(let o of Tt)if(await m(ve(e,o)))return"biome";for(let o of Gt)if(await m(ve(e,o)))return"eslint";for(let o of Bt)if(await m(ve(e,o)))return"oxlint";let t=De(e);if(t===e)break;e=t}return null};var Dt=(e,t)=>{let o=["check","--no-errors-on-unmatched",...t];e.length>0?o.push(...e):o.push("./");let i=h("biome",o,{stdio:"inherit"});v("Biome",i)},Pt=(e,t)=>{let o=[...t,...e.length>0?e:["."]],i=h("eslint",o,{stdio:"inherit"});v("ESLint",i)},Ft=(e,t)=>{let o=["--check",...t,...e.length>0?e:["."]],i=h("prettier",o,{stdio:"inherit"});v("Prettier",i)},Nt=(e,t)=>{let o=[...t,...e.length>0?e:["."]],i=h("stylelint",o,{stdio:"inherit"});v("Stylelint",i)},Ot=(e,t)=>{let o=[...t,...e.length>0?e:["."]],i=h("oxlint",o,{stdio:"inherit"});v("Oxlint",i)},Lt=(e,t)=>{let o=["--check",...t,...e.length>0?e:["."]],i=h("oxfmt",o,{stdio:"inherit"});v("oxfmt",i)},Pe=async(e=[],t=[])=>{let o=await X();if(!o)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(o){case"eslint":{await Ft(e,[]),await Pt(e,t),await Nt(e,[]);break}case"oxlint":{await Lt(e,[]),await Ot(e,t);break}default:await Dt(e,t)}};import{existsSync as U}from"fs";import{readFile as te}from"fs/promises";import{join as I}from"path";import E from"process";import{intro as Rt,log as ee,outro as ye,spinner as Mt}from"@clack/prompts";import{parse as $t}from"jsonc-parser";var _t=[".prettierrc",".prettierrc.js",".prettierrc.cjs",".prettierrc.mjs",".prettierrc.json",".prettierrc.yaml",".prettierrc.yml","prettier.config.js","prettier.config.mjs","prettier.config.cjs"],Vt=[".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"],Wt=()=>{let e=h("biome",["--version"],{encoding:"utf-8"});return e.status===0&&e.stdout?{message:`Biome is installed (${String(e.stdout).trim()})`,name:"Biome installation",status:"pass"}:{message:"Biome is not installed or not accessible",name:"Biome installation",status:"fail"}},Jt=()=>{let e=h("eslint",["--version"],{encoding:"utf-8"});return e.status===0&&e.stdout?{message:`ESLint is installed (${String(e.stdout).trim()})`,name:"ESLint installation",status:"pass"}:{message:"ESLint is not installed (optional)",name:"ESLint installation",status:"warn"}},qt=()=>{let e=h("oxlint",["--version"],{encoding:"utf-8"});return e.status===0&&e.stdout?{message:`Oxlint is installed (${String(e.stdout).trim()})`,name:"Oxlint installation",status:"pass"}:{message:"Oxlint is not installed (optional)",name:"Oxlint installation",status:"warn"}},Ht=async()=>{let e=I(E.cwd(),"biome.json"),t=I(E.cwd(),"biome.jsonc"),o=null;if(U(e)?o=e:U(t)&&(o=t),!o)return{message:"No biome.json or biome.jsonc file found",name:"Biome configuration",status:"warn"};try{let i=await te(o,"utf-8"),s=$t(i);return Array.isArray(s?.extends)&&s.extends.includes("ultracite/biome/core")?{message:"biome.json(c) extends ultracite/biome/core",name:"Biome configuration",status:"pass"}:{message:"biome.json(c) exists but doesn't extend ultracite/biome/core",name:"Biome configuration",status:"warn"}}catch{return{message:"Could not parse biome.json(c) file",name:"Biome configuration",status:"fail"}}},Kt=async()=>{let e=["eslint.config.mjs","eslint.config.js","eslint.config.cjs","eslint.config.ts","eslint.config.mts","eslint.config.cts"],t=null;for(let o of e){let i=I(E.cwd(),o);if(U(i)){t=i;break}}if(!t)return{message:"No eslint.config.* file found (optional)",name:"ESLint configuration",status:"warn"};try{return(await te(t,"utf-8")).includes("ultracite/eslint")?{message:"eslint.config.* imports ultracite/eslint",name:"ESLint configuration",status:"pass"}:{message:"eslint.config.* exists but doesn't import ultracite/eslint",name:"ESLint configuration",status:"warn"}}catch{return{message:"Could not read eslint.config.* file",name:"ESLint configuration",status:"fail"}}},Qt=e=>`ultracite/config/oxlint/${e}`,Zt=async()=>{let e=I(E.cwd(),"oxlint.config.ts");if(!U(e))return{message:"No oxlint.config.ts file found (optional)",name:"Oxlint configuration",status:"warn"};try{return(await te(e,"utf-8")).includes(Qt("core"))?{message:"oxlint.config.ts extends ultracite oxlint config",name:"Oxlint configuration",status:"pass"}:{message:"oxlint.config.ts exists but doesn't extend ultracite config",name:"Oxlint configuration",status:"warn"}}catch{return{message:"Could not read oxlint.config.ts file",name:"Oxlint configuration",status:"fail"}}},Yt=async()=>{let e=I(E.cwd(),"package.json");if(!U(e))return{message:"No package.json found",name:"Ultracite dependency",status:"warn"};try{let t=JSON.parse(await te(e,"utf-8")),o=t.dependencies?.ultracite||t.devDependencies?.ultracite||t.peerDependencies?.ultracite;return o?{message:`Ultracite is in package.json (${o})`,name:"Ultracite dependency",status:"pass"}:{message:"Ultracite not found in package.json dependencies",name:"Ultracite dependency",status:"warn"}}catch{return{message:"Could not parse package.json",name:"Ultracite dependency",status:"warn"}}},Xt=()=>{let e=_t.some(i=>U(I(E.cwd(),i))),o=Vt.filter(i=>!i.startsWith("eslint.config")).some(i=>U(I(E.cwd(),i)));if(e||o){let i=[];return e&&i.push("Prettier"),o&&i.push("ESLint (legacy config)"),{message:`Found potentially conflicting tools: ${i.join(", ")}`,name:"Conflicting tools",status:"warn"}}return{message:"No conflicting formatting/linting tools found",name:"Conflicting tools",status:"pass"}},A=async(e,t)=>{let o=Mt();o.start(`Checking ${t}...`);let i=await e();return i.status==="pass"||i.status,o.stop(i.message),i},Fe=async()=>{Rt(`Ultracite v${d.version} Doctor`);let e=[await A(Wt,"Biome installation"),await A(Jt,"ESLint installation"),await A(qt,"Oxlint installation"),await A(Ht,"Biome configuration"),await A(Kt,"ESLint configuration"),await A(Zt,"Oxlint configuration"),await A(Yt,"Ultracite dependency"),await A(Xt,"conflicting tools")],t=e.filter(s=>s.status==="pass").length,o=e.filter(s=>s.status==="fail").length,i=e.filter(s=>s.status==="warn").length;if(ee.info(`Summary: ${t} passed, ${i} warnings, ${o} failed`),o>0)throw ee.error("Some checks failed. Run 'ultracite init' to fix issues."),ye("Doctor complete"),new Error("Doctor checks failed");if(i>0){ee.warn("Some optional improvements available. Run 'ultracite init' to configure."),ye("Doctor complete");return}ee.success("Everything looks good!"),ye("Doctor complete")};var e2=(e,t)=>{let o=["check","--write","--no-errors-on-unmatched",...t];e.length>0?o.push(...e):o.push("./");let i=h("biome",o,{stdio:"inherit"});v("Biome",i)},t2=(e,t)=>{let o=["--fix",...t,...e.length>0?e:["."]],i=h("eslint",o,{stdio:"inherit"});v("ESLint",i)},o2=(e,t)=>{let o=["--write",...t,...e.length>0?e:["."]],i=h("prettier",o,{stdio:"inherit"});v("Prettier",i)},i2=(e,t)=>{let o=["--fix",...t,...e.length>0?e:["."]],i=h("stylelint",o,{stdio:"inherit"});v("Stylelint",i)},s2=(e,t)=>{let o=t.includes("--unsafe"),i=t.filter(l=>l!=="--unsafe"),s=[o?"--fix-dangerously":"--fix",...i,...e.length>0?e:["."]],r=h("oxlint",s,{stdio:"inherit"});v("Oxlint",r)},n2=(e,t)=>{let o=["--write",...t,...e.length>0?e:["."]],i=h("oxfmt",o,{stdio:"inherit"});v("oxfmt",i)},Ne=async(e,t=[])=>{let o=await X();if(!o)throw new Error("No linter configuration found. Run `ultracite init` to set up a linter.");switch(o){case"eslint":{await o2(e,[]),await t2(e,t),await i2(e,[]);break}case"oxlint":{await n2(e,[]),await s2(e,t);break}default:await e2(e,t)}};import Ii from"process";import{cancel as L,intro as Ei,isCancel as R,log as Z,multiselect as Y,select as ji,spinner as w}from"@clack/prompts";var Oe="./adal-VMG3GLKT.svg";var Le="./aider-K7JLZT2D.svg";var Re="./amazon-q-TSOJNPXB.svg";var Me="./amp-EV4LVL5I.svg";var $e="./augmentcode-Q62PVXKO.svg";var oe="./bob-MRQ23J26.svg";var _e="./claude-6DLEHRDQ.svg";var Ve="./cline-6HWKIYN7.svg";var We="./coder-7BVXO5OJ.svg";var Je="./codex-NQZ5TJCL.svg";var qe="./continue-LKI2ZW3R.svg";var He="./copilot-L2IY45R2.svg";var Ke="./crush-LYLRDQGZ.svg";var ie="./cursor-GQNH5LCA.svg";var Qe="./devin-KY5ISKEW.svg";var Ze="./droid-266OHJBT.svg";var Ye="./firebase-studio-ILLWWYU7.svg";var Xe="./firebender-UNO6LSZG.svg";var e1="./gemini-OYS6V4BH.svg";var t1="./goose-XBIEVD4H.svg";var o1="./jules-HJPVWU73.svg";var i1="./junie-RUWBUV6N.svg";var s1="./kilo-code-4QYUYY2E.svg";var n1="./kimi-6SOFW673.svg";var a1="./langchain-5SXQKAL3.svg";var r1="./lovable-UELF2DY5.svg";var l1="./mcpjam-V2GHUPJN.svg";var c1="./mistral-HQ63EC2B.svg";var d1="./ona-KYYK3HQX.svg";var p1="./open-hands-K5EYKO6T.svg";var m1="./openclaw-XFPF7FMJ.svg";var f1="./opencode-K3274JKQ.svg";var g1="./pi-AZOSKO3D.svg";var u1="./qoder-LPW47DKG.svg";var h1="./qwen-N3D5CQYL.svg";var w1="./replit-WKR4Y6HH.svg";var v1="./roo-code-CVLBTS7D.svg";var y1="./snowflake-S3LTTUXJ.svg";var k1="./vercel-27VSITAQ.svg";var b1="./warp-OZKAAQRT.svg";var x1="./zencoder-VTSK5Z7Z.svg";var se=(e,t)=>`# Ultracite Code Standards
|
|
3
3
|
|
|
4
4
|
This project uses **Ultracite**, a zero-config preset that enforces strict code quality standards through automated formatting and linting.
|
|
5
5
|
|
|
@@ -122,17 +122,17 @@ ${t}'s linter will catch most issues automatically. Focus your attention on:
|
|
|
122
122
|
---
|
|
123
123
|
|
|
124
124
|
Most formatting and common issues are automatically fixed by ${t}. Run \`${e} ultracite fix\` before committing to ensure compliance.
|
|
125
|
-
`;var n=(e,t)=>({description:t,title:e}),a=(e,t,o)=>({description:t,icon:o,title:e});var T=[{category:"terminal-agent",config:{appendMode:!0,path:".claude/CLAUDE.md"},content:{differentiators:[a("Terminal-native workflow","Claude Code already lives in the terminal, so Ultracite guidance stays close to the commands, diffs, and review loops developers run every day.","Terminal"),a("Rules plus hooks","Claude Code is one of the few agent integrations here that can pair repo instructions with an automatic PostToolUse hook for cleanup after edits.","Workflow"),a("Long-running repo work","The integration works especially well for multi-file refactors where Claude Code needs explicit guardrails around architecture, typing, and conventions.","GitBranch")],faq:[{answer:"Ultracite writes the coding rules to `.claude/CLAUDE.md`. The optional hook config lives in `.claude/settings.json` and runs after file edits.",question:"Do I need both CLAUDE.md and settings.json?"},{answer:"The rules file is appended so you can keep existing project guidance in place. The hook config is merged separately in the settings file.",question:"Will Ultracite overwrite my existing Claude setup?"}],intro:"Use Ultracite with Claude Code when you want an agentic terminal workflow to respect the same code standards your team expects from human contributors. It is a strong fit for repo-wide edits, review loops, and autonomous tasks where consistency matters as much as speed.",metaDescription:"Configure Claude Code with Ultracite so terminal-based agent runs follow your TypeScript, React, accessibility, and performance standards from the first edit.",useCases:[n("Repo-wide refactors from the terminal","Give Claude Code clear repo instructions before it edits many files, renames APIs, or updates patterns across a monorepo."),n("Remote and SSH-heavy development","Keep standards close to terminal workflows when you work in remote environments where editor-specific settings are less useful."),n("Teams standardizing autonomous runs","Share one CLAUDE.md contract so multiple developers can run Claude Code without each session drifting into a different style.")]},description:"Anthropic's official CLI for Claude, an agentic coding tool that lives in your terminal.",hooks:{getContent:e=>({hooks:{PostToolUse:[{hooks:[{command:e,type:"command"}],matcher:"Write|Edit"}]}}),path:".claude/settings.json"},id:"claude",logo:_e,logoFile:"claude.svg",name:"Claude Code",subtitle:"Anthropic's agentic CLI"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Cloud-run task execution","Codex works asynchronously, so Ultracite gives each remote task the same repo-aware instructions without relying on local editor state.","Cloud"),a("AGENTS.md compatibility","The integration uses the same `AGENTS.md` convention many agent tools understand, making it easy to share repo guidance across systems.","Layers"),a("Clean handoffs","Codex benefits from explicit standards when tasks are delegated, reviewed later, or resumed in a fresh cloud context.","Bot")],faq:[{answer:"No. Ultracite appends its guidance to `AGENTS.md`, so you can keep broader repo notes and add coding standards in the same place.",question:"Does Codex need a separate rules file format?"},{answer:"Yes. Because Codex tasks may execute remotely, putting repo guidance in `AGENTS.md` ensures every run starts with the same shared contract.",question:"Why is AGENTS.md useful for Codex specifically?"}],intro:"Use Ultracite with Codex when you want cloud-executed development tasks to inherit the same standards you apply in local workflows. It is well suited to delegated implementation, long-running async work, and repos where handoff quality matters.",metaDescription:"Add Ultracite to Codex via AGENTS.md so OpenAI's coding agent produces repo-aware code that matches your team's linting and architecture standards.",useCases:[n("Async background implementation","Give Codex a stable repo contract before it works through larger tasks outside your interactive editor session."),n("Cross-repo standardization","Use the same AGENTS.md pattern across repositories so Codex starts every task with familiar instructions and expectations."),n("Review-heavy delivery","Reduce cleanup during review by making type safety, accessibility, and framework conventions explicit before Codex writes code.")]},description:"OpenAI's cloud-based coding agent for autonomous software development tasks.",id:"codex",logo:Je,logoFile:"codex.svg",name:"Codex",subtitle:"OpenAI's coding agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Built for background work","Jules runs asynchronously, so shared repo instructions matter more than local IDE settings or one-off chat prompts.","Clock3"),a("Low-friction setup","Jules uses `AGENTS.md`, which keeps the integration simple and portable across repos without another custom config surface.","Command"),a("Strong for queued tasks","Ultracite helps Jules keep standards intact when it works through queued fixes, migrations, or codebase chores over time.","Workflow")],intro:"Use Ultracite with Jules when you want a background coding agent to start from explicit repo standards instead of ad hoc prompts. It fits teams that queue work for async execution and still want predictable code shape when the result comes back.",metaDescription:"Configure Jules with Ultracite through AGENTS.md so Google's async coding agent returns code that matches your repo standards and review expectations.",useCases:[n("Queued maintenance work","Keep standards stable when Jules handles dependency updates, cleanup tasks, or incremental fixes in the background."),n("Distributed team handoffs","Give every async run the same instructions so results stay consistent even when different teammates trigger the work."),n("Multi-repo automation","Reuse the same AGENTS.md pattern across several codebases where Jules needs clear project-specific expectations.")]},description:"Google's asynchronous AI coding agent that works in the background to complete development tasks.",id:"jules",logo:o1,logoFile:"jules.svg",name:"Jules",subtitle:"Google's async agent"},{category:"cloud-agent",config:{appendMode:!0,path:"replit.md"},content:{differentiators:[a("Workspace-native instructions","Replit Agent already expects repo guidance in `replit.md`, so Ultracite can fit naturally into the browser workflow without introducing another config surface.","Cloud"),a("Fast prototype-to-product loop","Replit is strong for building quickly in the browser, and explicit repo rules help generated code stay maintainable once the project grows beyond a demo.","Rocket"),a("Collaborative workspace fit","Because Replit projects are often shared across teammates, a committed rules file helps keep the coding contract stable between sessions and handoffs.","Users")],intro:"Use Ultracite with Replit Agent when you want browser-based app generation to stay aligned with the same standards you expect in a maintained codebase. It is especially useful for full-stack products that start fast, but still need reviewable, team-friendly code as they evolve.",metaDescription:"Configure Replit Agent with Ultracite through replit.md so browser-based app generation follows your repo's linting, architecture, and framework standards.",useCases:[n("Browser-based full-stack building","Give Replit Agent a durable repo contract before it generates frontend, backend, and configuration code in the same workspace."),n("Prototypes that need guardrails","Keep early product iterations aligned with your team's typing, accessibility, and architecture expectations."),n("Shared cloud workspaces","Use one committed `replit.md` file so collaborators get the same coding guidance every time they open the project.")]},description:"Replit's cloud agent for building and iterating on apps directly in the browser.",id:"replit",logo:w1,logoFile:"replit.svg",name:"Replit Agent",subtitle:"Replit's cloud agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Agent-first execution","Devin is built around autonomous software work, so explicit repo rules help long-running tasks come back as reviewable changes instead of cleanup-heavy drafts.","Bot"),a("Native AGENTS.md support","Devin uses `AGENTS.md`, which keeps the integration portable and consistent with other cloud agents already in the Ultracite dataset.","Layers"),a("Strong for multi-step tasks","Persistent repo guidance helps Devin stay aligned across investigation, implementation, and follow-up passes on the same task.","Workflow")],intro:"Use Ultracite with Devin when you want delegated engineering work to stay inside a clear repo contract from the first file read to the final patch. It is a strong fit for teams assigning real implementation work and expecting the result to hold up in review.",metaDescription:"Add Ultracite to Devin through AGENTS.md so Cognition's software engineering agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Asynchronous task delegation","Give Devin a stable repo contract before it works through larger implementation tasks outside the normal interactive development loop."),n("Review-ready autonomous patches","Reduce cleanup during review by making naming, typing, and framework conventions explicit before the task starts."),n("Multi-step bug investigation","Keep standards stable while Devin traces behavior, updates code in several places, and iterates on a fix.")]},description:"Cognition's autonomous software engineering agent for completing development tasks in the background.",id:"devin",logo:Qe,logoFile:"devin.svg",name:"Devin",subtitle:"Cognition's async agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Product-focused generation","Lovable can move from prompt to working app quickly, so explicit repo rules help generated code stay maintainable once the prototype becomes a real product.","Sparkles"),a("Portable repo guidance","Using `AGENTS.md` gives Lovable a committed project contract that can live alongside other agent tools instead of hiding standards in workspace-only settings.","Layers"),a("Better prototype handoff","Ultracite helps Lovable output feel closer to team-owned production code, which makes the handoff from idea to review much smoother.","ShieldCheck")],intro:"Use Ultracite with Lovable when you want fast app generation without dropping the quality bar your team expects from maintained code. It is especially helpful when a quick prototype is likely to turn into a shipped product with ongoing review and iteration.",metaDescription:"Configure Lovable with Ultracite through AGENTS.md so AI-generated apps follow your repo's coding, architecture, and review standards from the first commit.",useCases:[n("Prompt-to-product builds","Keep Lovable aligned when a generated app moves beyond a demo and into a codebase your team will keep shipping."),n("Rapid iteration with guardrails","Make architecture, typing, and framework conventions explicit before Lovable generates new pages, flows, or backend logic."),n("Shared product experiments","Use one committed AGENTS.md file so follow-up sessions and teammates inherit the same coding expectations.")]},description:"Lovable's AI app builder for generating and iterating on full-stack products in the cloud.",id:"lovable",logo:r1,logoFile:"lovable.svg",name:"Lovable",subtitle:"Lovable's app builder"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("IDE-first guidance","Zencoder is designed to work close to the editor, so a committed `AGENTS.md` file helps steer generated edits before they become review feedback.","Monitor"),a("Portable repo contract","Using `AGENTS.md` keeps Zencoder aligned with the same repository guidance other agent tools can reuse across the stack.","Layers"),a("Useful for team handoffs","Explicit repo standards help Zencoder stay consistent when several developers bounce between the same editor-assisted workflow.","Users")],intro:"Use Ultracite with Zencoder when you want an editor-native coding agent to follow the same repo contract your team expects from human contributors. It fits best when AI-assisted edits happen close to the IDE, but still need to land cleanly in review.",metaDescription:"Configure Zencoder with Ultracite through AGENTS.md so its IDE agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Editor-assisted implementation","Guide Zencoder before it creates or edits files so the first draft already reflects your repo conventions."),n("Shared IDE workflows","Use one committed AGENTS.md file so teammates get the same coding contract in every Zencoder session."),n("Review-conscious AI edits","Reduce cleanup after editor-side generations by making typing, naming, and structure explicit upfront.")]},description:"Zencoder's IDE coding agent for generating and refining code inside the editor workflow.",id:"zencoder",logo:x1,logoFile:"zencoder.svg",name:"Zencoder",subtitle:"Zencoder's IDE agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Background-first execution","Ona is designed around delegated work, so a committed repo contract helps long-running tasks return reviewable code instead of cleanup-heavy drafts.","Cloud"),a("Shared AGENTS.md setup","Using `AGENTS.md` keeps the integration simple and portable across repositories without introducing another product-specific file.","Layers"),a("Strong for async delivery","Ultracite gives Ona a stable coding baseline before work is handed off, resumed later, or reviewed by another teammate.","Workflow")],intro:"Use Ultracite with Ona when you want cloud-executed engineering work to inherit the same repo standards your team uses locally. It is a strong fit for async delivery where handoff quality matters as much as speed.",metaDescription:"Add Ultracite to Ona through AGENTS.md so its cloud agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Delegated background work","Give Ona a durable repo contract before it works through larger implementation tasks asynchronously."),n("Multi-repo consistency","Reuse the same AGENTS.md pattern across repositories where Ona needs explicit project expectations."),n("Review-ready delivery","Reduce cleanup during review by making accessibility, naming, and architecture expectations explicit before code is written.")]},description:"Ona's cloud coding agent for asynchronous implementation and engineering tasks.",id:"ona",logo:d1,logoFile:"ona.svg",name:"Ona",subtitle:"Ona's cloud agent"},{category:"open-source-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Open-source agent gateway","OpenClaw benefits from an explicit repo contract because it can orchestrate several coding flows across an open, self-hostable stack.","Globe"),a("Portable AGENTS.md contract","Using `AGENTS.md` keeps OpenClaw aligned with a convention that is easy to commit, audit, and reuse across repos.","Layers"),a("Reproducible experiments","Committed repo guidance makes OpenClaw easier to evaluate across environments because the same standards follow every run.","ShieldCheck")],intro:"Use Ultracite with OpenClaw when you want an open-source agent stack to follow explicit repo guidance instead of relying on ad hoc prompts. It is especially useful for teams experimenting with self-hosted or reproducible AI development workflows.",metaDescription:"Configure OpenClaw with Ultracite through AGENTS.md so its open-source agent stack follows your repo's implementation and review standards.",useCases:[n("Self-hosted agent experiments","Keep OpenClaw grounded when you evaluate autonomous coding workflows in your own infrastructure."),n("Reproducible repo demos","Use a committed AGENTS.md file so contributors can see the same repo guidance every time OpenClaw runs."),n("Open-source team workflows","Share one durable coding contract so multiple users can run OpenClaw without style drift.")]},description:"An open-source agent gateway for orchestrating coding workflows with a committed repo contract.",id:"openclaw",logo:m1,logoFile:"openclaw.svg",name:"OpenClaw",subtitle:"Open-source agent gateway"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Terminal-native control","Continue can work close to terminal and automation workflows, so repo guidance helps keep broad code changes aligned with the project contract.","Terminal"),a("Simple AGENTS.md adoption","Using `AGENTS.md` gives Continue a repo-scoped instruction file that is easy to review and reuse across environments.","Layers"),a("Good for iterative agent loops","Ultracite helps Continue stay consistent during repeated investigate-edit-review cycles where drift can build up over time.","Workflow")],intro:"Use Ultracite with Continue when you want terminal-driven agent work to stay anchored to a committed repo contract. It is a practical fit for teams that want lightweight adoption without giving up reviewable code quality.",metaDescription:"Configure Continue with Ultracite through AGENTS.md so its terminal agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Terminal-heavy development","Keep Continue aligned while you switch between shell commands, repo analysis, and code generation."),n("Fast iterative fixes","Use a committed AGENTS.md file to stabilize behavior across several short agent loops in the same task."),n("Portable repo guidance","Reuse one repo contract across environments where Continue needs clear coding expectations.")]},description:"Continue's terminal coding agent for iterative implementation and repo-aware edits.",id:"continue",logo:qe,logoFile:"continue.svg",name:"Continue",subtitle:"Continue's terminal agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Data-platform context","Snowflake Cortex sits close to data and platform workflows, so explicit repo guidance helps generated code stay aligned with broader engineering standards.","Cloud"),a("Shared AGENTS.md contract","Using `AGENTS.md` keeps Cortex guidance portable and easy to commit even when code spans data, application, and operational concerns.","Layers"),a("Useful for full-stack data work","Ultracite helps Cortex produce changes that are easier to review when SQL-adjacent logic and app code live in the same repository.","Boxes")],intro:"Use Ultracite with Snowflake Cortex when you want cloud-connected code generation to respect the same repo standards your team expects across application and data-oriented work. It is especially useful where data logic and shipped code evolve together.",metaDescription:"Add Ultracite to Snowflake Cortex through AGENTS.md so cloud-connected engineering work follows your repo's coding and review standards.",useCases:[n("Data-aware application repos","Keep Cortex aligned when application code, data logic, and supporting scripts change together."),n("Platform-connected features","Use a committed repo contract before Cortex works on code that touches product and platform concerns in the same task."),n("Review-friendly data workflows","Reduce cleanup by making naming, typing, and structure explicit before cloud-generated changes reach review.")]},description:"Snowflake's cloud AI platform for engineering and data-adjacent development workflows.",id:"snowflake-cortex",logo:y1,logoFile:"snowflake-cortex.svg",name:"Snowflake Cortex",subtitle:"Snowflake's AI platform agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Framework-backed autonomy","Deepagents is built for multi-step agent flows, so explicit repo standards help each step stay aligned with the codebase contract.","Bot"),a("Portable AGENTS.md file","Using `AGENTS.md` keeps guidance close to the repo rather than hidden in agent runtime settings.","Layers"),a("Good for long task chains","Committed repo instructions help Deepagents stay consistent across research, planning, and implementation passes.","Workflow")],intro:"Use Ultracite with Deepagents when you want agentic task chains to inherit the same repo standards your team expects from direct edits. It is a good fit for multi-step work where consistency matters across several sub-tasks.",metaDescription:"Configure Deepagents with Ultracite through AGENTS.md so terminal agent workflows follow your repo's linting, architecture, and review standards.",useCases:[n("Multi-step implementation flows","Keep Deepagents aligned when one task spans research, coding, and several follow-up changes."),n("Agent framework prototypes","Use a committed repo contract while you experiment with Deepagents in real repositories."),n("Structured autonomous work","Reduce drift by giving every Deepagents run the same durable coding baseline.")]},description:"LangChain's deep agent framework for multi-step terminal-driven coding workflows.",id:"deepagents",logo:a1,logoFile:"deepagents.svg",name:"Deepagents",subtitle:"LangChain's deep agent framework"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("CLI-first coding flow","Qoder works well in terminal-centric development, so a committed repo contract helps generated patches stay aligned with local workflows.","Terminal"),a("Shared AGENTS.md setup","Using `AGENTS.md` keeps the integration portable and easy to audit when Qoder is used across several repositories.","Layers"),a("Fast prompt-to-patch loops","Ultracite gives Qoder a stable baseline during rapid iteration where output quality can otherwise vary widely.","Gauge")],intro:"Use Ultracite with Qoder when you want a fast CLI coding agent to move quickly without abandoning the repo standards your team depends on. It is a strong fit for terminal-heavy workflows and quick implementation loops.",metaDescription:"Add Ultracite to Qoder through AGENTS.md so its coding CLI follows your repo's linting, architecture, and framework standards.",useCases:[n("Fast terminal iteration","Keep Qoder aligned while you move quickly from prompt to patch and refine the result in the shell."),n("Portable repo setup","Reuse one AGENTS.md pattern across repositories where Qoder needs explicit project expectations."),n("Review-conscious generation","Make repo standards explicit before terminal-generated edits reach human review.")]},description:"Qoder's terminal coding agent for fast prompt-to-patch development loops.",id:"qoder",logo:u1,logoFile:"qoder.svg",name:"Qoder",subtitle:"Qoder's terminal agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Dedicated coding CLI","Kimi CLI is built for agentic coding from the terminal, so committed repo standards help broad natural-language tasks resolve into consistent implementation choices.","Command"),a("Portable AGENTS.md contract","The integration uses a shared repo file that is easy to commit, review, and reuse across codebases.","Layers"),a("Useful for rapid iteration","Ultracite helps Kimi CLI stay disciplined during fast prompt-driven loops where output quality can otherwise swing a lot.","Gauge")],intro:"Use Ultracite with Kimi CLI when you want a coding-focused terminal agent to move quickly without drifting away from your repo's standards. It is a practical fit for natural-language tasking and shell-first development.",metaDescription:"Configure Kimi CLI with Ultracite through AGENTS.md so its coding agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Natural-language terminal tasking","Keep Kimi CLI aligned when broad prompt requests need to turn into code that still fits the project."),n("Fast fix loops","Use a committed repo contract to stabilize output during quick terminal-driven iterations."),n("Shared coding standards","Reuse one AGENTS.md file across repos where Kimi CLI needs explicit project guidance.")]},description:"Kimi's terminal coding CLI for natural-language implementation tasks.",id:"kimi-cli",logo:n1,logoFile:"kimi-cli.svg",name:"Kimi CLI",subtitle:"Kimi's coding CLI"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Cloud-based MCP workflow","MCPJam fits hosted coordination and evaluation workflows, so a committed repo contract helps keep generated changes aligned with project standards.","Cloud"),a("Shared AGENTS.md convention","Using `AGENTS.md` gives MCPJam a portable repo instruction file that works well across several projects and collaborators.","Layers"),a("Good for tool-rich experiments","Ultracite helps MCPJam stay consistent when work spans several tools, prompts, and follow-up iterations.","Workflow")],intro:"Use Ultracite with MCPJam when you want hosted, tool-connected agent workflows to follow the same repo standards your team expects elsewhere. It is especially useful when experimentation still needs a durable project contract behind it.",metaDescription:"Configure MCPJam with Ultracite through AGENTS.md so hosted agent workflows follow your repo's implementation and review standards.",useCases:[n("Tool-rich hosted workflows","Keep MCPJam aligned when a task moves across several connected tools before changes land in the repo."),n("Experimentation with guardrails","Use AGENTS.md so exploratory agent work still respects the project's coding standards."),n("Shared project contracts","Commit one repo-level file so MCPJam sessions start from the same expectations every time.")]},description:"MCPJam's cloud agent workflow for connected, repo-aware engineering tasks.",id:"mcpjam",logo:l1,logoFile:"mcpjam.svg",name:"MCPJam",subtitle:"MCPJam's cloud agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Background agent execution","Mux is built for asynchronous agent work, so explicit repo rules help the result come back reviewable and consistent.","Cloud"),a("Portable AGENTS.md setup","Using `AGENTS.md` keeps Mux aligned with a repo-level convention that is easy to version and share across workspaces.","Layers"),a("Strong for queued tasks","Ultracite helps Mux keep standards intact when several background tasks or workspaces touch the same repository over time.","Workflow")],intro:"Use Ultracite with Mux when you want background coding agents to follow the same repo standards your team expects from local development. It is a strong fit for queued work, parallel sessions, and async implementation handoffs.",metaDescription:"Add Ultracite to Mux through AGENTS.md so its background agents follow your repo's coding and review standards.",useCases:[n("Queued background implementation","Give Mux a stable repo contract before several async tasks work through the same codebase."),n("Parallel agent workspaces","Use one AGENTS.md file so multiple workspaces inherit the same standards and expectations."),n("Review-ready async delivery","Reduce cleanup by making naming, structure, and framework conventions explicit before work starts.")]},description:"Coder's background agent system for cloud-executed engineering tasks across workspaces.",id:"mux",logo:We,logoFile:"coder.svg",name:"Mux",subtitle:"Coder's background agents"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Terminal-first coding flow","Pi lives close to the shell, so a committed repo contract helps AI assistance stay disciplined while you work through real repository changes.","Terminal"),a("Simple AGENTS.md contract","Using `AGENTS.md` gives Pi a portable setup that is easy to commit and reuse across several projects.","Layers"),a("Good for focused implementation","Ultracite helps Pi stay consistent during fast prompt-to-code loops where output quality needs guardrails.","Gauge")],intro:"Use Ultracite with Pi when you want a shell-first coding agent to move quickly without drifting away from your repo standards. It is a good fit for focused terminal work and fast iteration.",metaDescription:"Configure Pi with Ultracite through AGENTS.md so its coding CLI follows your repo's linting, architecture, and framework standards.",useCases:[n("Focused terminal tasks","Keep Pi aligned on quick fixes and small features where speed matters but standards still matter too."),n("Portable repo guidance","Use one AGENTS.md file so Pi behaves consistently across different repositories and environments."),n("Prompt-driven coding loops","Anchor output in repo rules so concise interactions still produce reviewable code.")]},description:"Pi's shell-first coding CLI for focused implementation and repo-aware edits.",id:"pi",logo:g1,logoFile:"pi.svg",name:"Pi",subtitle:"Pi's coding CLI"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("CLI-oriented coding flow","AdaL fits shell-based implementation work, so explicit repo standards help prompt-driven edits stay consistent with the existing codebase.","Terminal"),a("Portable AGENTS.md contract","Using `AGENTS.md` gives AdaL a simple, shareable setup that works across repositories and contributors.","Layers"),a("Good for repeated task loops","Ultracite keeps AdaL aligned across several small implementation steps where drift can otherwise build up quickly.","Workflow")],intro:"Use Ultracite with AdaL when you want a coding CLI to stay inside a durable repo contract instead of relying on repeated prompt context. It is a good fit for shell-first development and iterative implementation work.",metaDescription:"Configure AdaL with Ultracite through AGENTS.md so its coding CLI follows your repo's linting, architecture, and framework standards.",useCases:[n("Shell-first development","Keep AdaL aligned while you move between commands, repo inspection, and generated edits in the terminal."),n("Iterative implementation loops","Use a committed repo contract to stabilize behavior across several small prompt-to-edit cycles."),n("Cross-project reuse","Reuse one AGENTS.md pattern across repos where AdaL needs explicit project expectations.")]},description:"Sylph's coding CLI for shell-first implementation and repo-aware edits.",id:"adal",logo:Oe,logoFile:"adal.svg",name:"AdaL",subtitle:"Sylph's coding CLI"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Editor-first guidance","GitHub Copilot benefits from repo instructions that shape inline completions and chat-assisted edits inside the normal development loop.","Github"),a("Shared AGENTS.md contract","Copilot can now read `AGENTS.md`, which lets teams keep one committed repo contract across Copilot and other compatible agents.","Layers"),a("Optional edit hooks","Copilot can pair instructions with a follow-up hook config, which makes it easier to auto-run fixers after AI-driven edits.","Workflow")],faq:[{answer:"Ultracite now writes Copilot guidance to `AGENTS.md`, which GitHub Copilot can read alongside other compatible tools. That keeps one shared repo contract instead of a Copilot-only file.",question:"Why does Ultracite use AGENTS.md for Copilot now?"},{answer:"If you enable hooks, Ultracite also writes `.github/hooks/ultracite.json` so post-edit fixes can run automatically after Copilot changes files.",question:"Can Copilot use hooks as well as instructions?"}],intro:"Use Ultracite with GitHub Copilot when you want inline completions, chat suggestions, and editor-side edits to stay inside your project's coding contract. It is especially useful for teams that rely on Copilot daily and want fewer stylistic cleanups during review.",metaDescription:"Set up GitHub Copilot with Ultracite via AGENTS.md so suggestions and AI-assisted edits follow your repo's formatting and framework standards.",useCases:[n("Day-to-day editor assistance","Keep Copilot's inline suggestions aligned with your repo standards while developers stay inside their normal IDE workflow."),n("Large teams using Copilot Chat","Share one AGENTS.md file so Copilot behaves consistently across many contributors, feature branches, and compatible agent tools."),n("Automated post-edit cleanup","Pair Copilot instructions with hooks when you want formatting and fix steps to run after AI edits land in the working tree.")]},description:"GitHub's AI pair programmer that suggests code completions and helps write code faster.",hooks:{getContent:e=>({hooks:{PostToolUse:[{command:e,type:"command"}]}}),path:".github/hooks/ultracite.json"},id:"copilot",logo:He,logoFile:"copilot.svg",name:"GitHub Copilot",subtitle:"GitHub's AI pair programmer"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("VS Code-native autonomous flow","Cline acts directly inside VS Code, and `AGENTS.md` lets Ultracite shape autonomous edits where developers already review and approve changes.","Monitor"),a("Portable repo guidance","Using `AGENTS.md` keeps Cline aligned with the same repository guidance other compatible agent tools can reuse.","Layers"),a("Good fit for repo exploration","Cline often works through multi-step repo tasks, and explicit standards help it make consistent decisions across repeated edits.","FolderGit2")],intro:"Use Ultracite with Cline when you want an autonomous VS Code agent to make changes that already match your repo rules. It is a practical fit for developers who approve edits in-editor and want less style drift from long multi-file sessions.",metaDescription:"Configure Cline with Ultracite through AGENTS.md so autonomous VS Code edits follow your repo's linting, React, and TypeScript standards.",useCases:[n("Autonomous edits in VS Code","Guide Cline before it creates or modifies files so the first draft already reflects your team's standards."),n("Mixed human and AI workflows","Keep repo guidance in the same tool where developers inspect diffs, accept changes, and continue iterating."),n("Cross-tool repo standards","Use one AGENTS.md file when you want Cline and other compatible agents to inherit the same coding contract.")]},description:"An autonomous coding agent for VS Code that can create and edit files, run commands, and more.",id:"cline",logo:Ve,logoFile:"cline.svg",name:"Cline",subtitle:"Autonomous VS Code agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Codebase-aware assistant","AMP is designed around understanding larger repositories, which makes explicit repo standards especially valuable during search-heavy tasks.","BrainCircuit"),a("Shared repo contract","Using `AGENTS.md` keeps Ultracite guidance portable and easy to audit when Sourcegraph-powered workflows move between repositories.","GitBranch"),a("Strong for review preparation","The setup helps AMP produce changes that are easier to review because expectations are clear before the first file is touched.","ShieldCheck")],intro:"Use Ultracite with AMP when you want a codebase-aware agent to combine semantic repo understanding with explicit implementation standards. It works best in larger projects where context retrieval is powerful, but style drift can still slow reviews down.",metaDescription:"Add Ultracite to AMP via AGENTS.md so Sourcegraph's coding agent uses repo-aware search with explicit code quality and architecture guidance.",useCases:[n("Large codebase navigation","Give AMP a stable implementation contract before it reasons across many packages, modules, or services."),n("Review-ready patches","Reduce cleanup work after search-driven edits by making naming, typing, and framework conventions explicit upfront."),n("Sourcegraph-heavy teams","Keep one repo-level instruction file for teams already leaning on Sourcegraph to answer code questions and generate fixes.")]},description:"Sourcegraph's AI coding agent that understands your entire codebase for intelligent assistance.",id:"amp",logo:Me,logoFile:"amp.svg",name:"AMP",subtitle:"Sourcegraph's coding agent"},{category:"terminal-agent",config:{path:"ultracite.md"},content:{differentiators:[a("Pair-programming cadence","Aider is conversational and iterative, so a single dedicated rules file helps every back-and-forth stay grounded in the same standards.","Terminal"),a("Dedicated config path","Aider uses `ultracite.md`, which gives the integration a focused file rather than a shared AGENTS.md document.","Command"),a("Works well with git-driven edits","Ultracite is useful when Aider is applying patches, staging changes, and iterating quickly against a repo's real history.","GitBranch")],intro:"Use Ultracite with Aider when you want terminal pair programming to stay aligned with the same repo rules you expect from direct edits. It is a natural fit for patch-based workflows, quick iterations, and developer-in-the-loop collaboration.",metaDescription:"Configure Aider with Ultracite through `ultracite.md` so terminal pair-programming sessions follow your repo's code quality and framework rules.",useCases:[n("Tight edit-review loops","Keep Aider aligned while you iterate quickly on a fix, inspect the patch, and ask for the next change."),n("Git-centric workflows","Use a dedicated rules file when Aider is operating close to commits, diffs, and staged changes."),n("Solo developer pair programming","Give Aider a persistent repo contract so it behaves consistently across multiple terminal sessions.")]},description:"AI pair programming in your terminal with support for multiple LLM providers.",id:"aider",logo:Le,logoFile:"aider.svg",name:"Aider",subtitle:"Terminal pair programming"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Cloud IDE setup","Firebase Studio runs in a hosted development environment, so repo-level rules help every workspace start with the same standards.","Cloud"),a("AGENTS.md compatibility","Firebase Studio can read `AGENTS.md`, which makes repo guidance easier to share across Studio and other compatible agent tools.","Layers"),a("Good for app stacks","The integration suits teams building full-stack apps in Firebase Studio where frontend, backend, and configuration files all need the same code quality bar.","Boxes")],intro:"Use Ultracite with Firebase Studio when you want a hosted IDE workspace to inherit the same project standards every time it boots. It is especially useful when multiple developers or generated workspaces touch the same app codebase.",metaDescription:"Set up Firebase Studio with Ultracite through AGENTS.md so Google's cloud IDE follows your repo's linting, accessibility, and performance rules from the start.",useCases:[n("Hosted app development","Give Firebase Studio a clear repo contract before it generates or edits frontend and backend code."),n("Shared cloud workspaces","Keep standards stable when several developers open the same project in a managed IDE environment."),n("Greenfield prototypes that need discipline","Add strong defaults early so generated code in a new Firebase Studio project does not drift before the team establishes habits.")]},description:"Google's AI-powered development environment integrated with Firebase services.",id:"firebase-studio",logo:Ye,logoFile:"firebase-studio.svg",name:"Firebase Studio",subtitle:"Google's cloud IDE"},{category:"open-source-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Open-source agent platform","OpenHands is designed for autonomous software work, so repo-level rules help keep generated changes aligned with human review expectations.","Bot"),a("Always-on repo guidance","Using `AGENTS.md` gives OpenHands a root-level instruction file it can keep in context across longer autonomous runs.","Layers"),a("Useful for reproducible runs","Because OpenHands can be deployed in different environments, a committed repo instruction file helps make behavior more predictable.","ShieldCheck")],intro:"Use Ultracite with OpenHands when you want an open-source autonomous agent to follow explicit project standards while it works through development tasks. The integration is a good fit for teams experimenting with reproducible agent runs in real repositories.",metaDescription:"Configure OpenHands with Ultracite through AGENTS.md so autonomous code changes stay aligned with your repo standards and review process.",useCases:[n("Autonomous task execution","Keep OpenHands grounded when it handles longer implementation tasks or explores a repository without constant human steering."),n("Open-source experimentation","Commit a clear repo instruction file so contributors testing OpenHands get consistent behavior across environments."),n("Reproducible agent demos","Use the same microagent guidance to show how OpenHands behaves in a repo before and after changes to your coding standards.")]},description:"An open-source platform for AI software development agents with autonomous capabilities.",id:"open-hands",logo:p1,logoFile:"open-hands.svg",name:"OpenHands",subtitle:"Open-source AI agents"},{category:"terminal-agent",config:{appendMode:!0,path:"GEMINI.md"},content:{differentiators:[a("Dedicated Gemini instructions","Gemini uses its own repo file, so Ultracite can tailor the setup without competing with other agent conventions.","Command"),a("Terminal-centered flow","The integration is optimized for developers who want AI help in the shell without depending on editor-specific settings.","Terminal"),a("Good cross-tool companion","Because many teams already use Gemini elsewhere, a committed repo file helps keep coding guidance consistent when they move into the CLI.","Layers")],intro:"Use Ultracite with Gemini when you want command-line AI assistance to start from a committed repo contract instead of repeating the same coding rules in prompts. It is a strong fit for teams that want a clean terminal setup with durable project guidance.",metaDescription:"Add Ultracite to Gemini through GEMINI.md so Google's terminal AI follows your repo's TypeScript, React, accessibility, and performance standards.",useCases:[n("Terminal-first development","Keep Gemini aligned while you work in the shell, inspect code, and iterate without switching into a dedicated AI editor."),n("Cross-repo consistency","Use a committed `GEMINI.md` file to keep standards stable as developers move between projects."),n("Prompt reduction","Avoid repeating architecture and style instructions every time you ask Gemini to help with a fix or refactor.")]},description:"Google's command-line interface for Gemini, bringing AI assistance to your terminal.",id:"gemini",logo:e1,logoFile:"gemini.svg",name:"Gemini",subtitle:"Google's terminal AI"},{category:"ide-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("JetBrains-native guidance","Junie lives inside the JetBrains ecosystem, so repo instructions help it work with the same precision developers expect from IDE-assisted workflows.","Laptop"),a("Portable AGENTS.md setup","Committing `AGENTS.md` means Junie can share the same repo contract as other compatible tools instead of relying on local IDE preferences alone.","Layers"),a("Useful for typed codebases","Junie is a good fit for strongly typed projects where explicit standards around TypeScript, testing, and architecture improve the quality of generated edits.","Code2")],intro:"Use Ultracite with Junie when you want JetBrains-assisted coding to follow a committed project contract instead of relying on per-user IDE habits. It is particularly helpful for typed application codebases where consistency and safe refactors matter.",metaDescription:"Configure Junie with Ultracite so JetBrains' AI agent follows your repo's code quality rules and team conventions inside the IDE.",useCases:[n("JetBrains-centered teams","Share one AGENTS.md file so Junie behaves predictably across IntelliJ, WebStorm, and other JetBrains workflows."),n("Typed refactors","Give Junie a stable contract before it updates TypeScript-heavy code or makes larger structural edits."),n("Repo onboarding","Help new contributors inherit the same IDE-side AI behavior by committing standards directly into the repo.")]},description:"JetBrains' AI coding agent integrated into their IDE ecosystem.",id:"junie",logo:i1,logoFile:"junie.svg",name:"Junie",subtitle:"JetBrains' AI agent"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Hierarchical AGENTS.md support","Augment Code can read `AGENTS.md`, which makes it easier to share repo standards across Augment and other compatible agents.","Layers"),a("Designed for collaboration","Ultracite complements Augment's team-oriented workflow by turning shared coding conventions into a committed repo asset.","Users"),a("Focused repo replacement","Because Ultracite writes the file directly, teams get a clean, deterministic rules payload instead of accumulating duplicate content over time.","ShieldCheck")],intro:"Use Ultracite with Augment Code when you want a team-oriented AI assistant to follow an explicit project ruleset stored with the repository. It fits organizations that want consistent AI output across shared development workflows and review processes.",metaDescription:"Set up Augment Code with Ultracite so its team-focused AI assistant follows committed repo rules for linting, architecture, and code quality.",useCases:[n("Shared enterprise workflows","Store a deterministic AGENTS.md file in the repo so Augment sessions across the team start from the same coding contract."),n("Code review discipline","Reduce review churn by making architecture and style expectations explicit before Augment suggests or edits code."),n("Cross-tool repo guidance","Use AGENTS.md when you want Augment and other compatible tools to inherit the same committed AI setup.")]},description:"An AI coding assistant focused on enterprise development workflows and team collaboration.",id:"augmentcode",logo:$e,logoFile:"augmentcode.svg",name:"Augment Code",subtitle:"Enterprise AI assistant"},{category:"ide-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Enterprise IDE workflows","Bob is built for teams adopting agentic coding inside the editor, with modes, governance-minded defaults, and integrations suited to large organizations.","Building2"),a("Shared AGENTS.md rules","IBM Bob reads the standard `AGENTS.md` rules file, the same format used by many AI coding tools. Ultracite writes your standards there so they work across agents.","Layers"),a("Beyond the editor","With literate coding, in-flow reviews, and Bob Shell for the terminal, a single committed contract keeps standards consistent across the surfaces where Bob works.","Workflow")],faq:[{answer:"Bob supports `.bob/rules/`, `.bobrules`, mode-specific files, global `~/.bob/rules/`, and `AGENTS.md`. Ultracite targets `AGENTS.md` so your standards are shared across Bob and other AI coding tools that read the same file.",question:"Does IBM Bob only use AGENTS.md for rules?"}],intro:"Use Ultracite with IBM Bob when you want an enterprise-focused AI coding partner in the IDE with committed rules in `AGENTS.md`. It suits organizations that combine agentic modes, editor assistance, and terminal workflows while keeping implementation rules reviewable in version control.",metaDescription:"Set up IBM Bob with Ultracite via AGENTS.md so IBM's AI assistant applies your repo's linting, TypeScript, and quality standards in the IDE.",useCases:[n("Team-wide AI standards","Commit `AGENTS.md` so every developer using Bob starts from the same coding, testing, and documentation expectations."),n("Agentic mode discipline","Give Bob explicit guardrails before it works in specialized modes or across larger refactors."),n("Editor and shell together","Keep `AGENTS.md` aligned when developers use Bob in the IDE and Bob Shell in the pipeline or locally.")]},description:"IBM's AI coding assistant for the IDE with agentic modes, literate coding, reviews, and Bob Shell for terminal workflows.",id:"bob",logo:oe,logoFile:"bob.svg",name:"IBM Bob",subtitle:"IBM's AI coding assistant"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Default AGENTS.md support","Kilo Code now supports `AGENTS.md` by default, which makes a committed repo contract the practical source of truth.","Layers"),a("Portable repo guidance","Using `AGENTS.md` keeps Kilo Code aligned with the same repository guidance other compatible agents can reuse.","FolderGit2"),a("Strong for repeatable suggestions","Explicit standards help Kilo Code produce more stable results across autocomplete, chat, and repeated editing sessions.","Sparkles")],intro:"Use Ultracite with Kilo Code when you want a configurable VS Code assistant to inherit a durable project contract instead of relying on one-off prompts. It is a good fit for teams that want repeatable AI behavior in a familiar editor workflow.",metaDescription:"Configure Kilo Code with Ultracite so customizable VS Code AI assistance follows your repo's formatting, typing, and framework conventions.",useCases:[n("Config-driven editor workflows","Keep AI behavior grounded in committed repo standards instead of per-user prompt preferences."),n("Repeatable VS Code assistance","Give Kilo Code stable rules for day-to-day suggestions, edits, and explanations inside the editor."),n("Team-managed AI setup","Store one AGENTS.md file in the repo so contributors can share one source of truth for Kilo Code behavior.")]},description:"A VS Code extension providing AI-powered coding assistance with customizable rules.",id:"kilo-code",logo:s1,logoFile:"kilo-code.svg",name:"Kilo Code",subtitle:"Customizable VS Code AI"},{category:"open-source-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Open-source terminal agent","Goose works well with committed repo guidance because it is often used by developers who want transparent, hackable agent workflows.","Terminal"),a("AGENTS.md-first discovery","Goose looks for `AGENTS.md` before `.goosehints`, which makes a shared repo contract the lightweight default.","Layers"),a("Autonomy with guardrails","The repo hints help Goose move quickly through autonomous work without losing consistency in style and structure.","ShieldCheck")],intro:"Use Ultracite with Goose when you want an open-source developer agent to work from a committed set of repo standards. It is a strong fit for terminal-heavy teams that want autonomy, but still need predictable edits and reviewable output.",metaDescription:"Add Ultracite to Goose through AGENTS.md so Block's open-source AI agent follows your repo's standards and review expectations.",useCases:[n("Terminal-heavy open-source workflows","Keep Goose aligned in repos where developers want an open toolchain and committed AI guidance."),n("Autonomous maintenance tasks","Use hints to steer Goose through repetitive fixes or cleanup work without repeating instructions in each run."),n("Experimental agent setups","Commit repo guidance so Goose behavior stays stable while you tune the rest of your local tooling.")]},description:"Block's open-source AI developer agent for autonomous software development.",id:"goose",logo:t1,logoFile:"goose.svg",name:"Goose",subtitle:"Block's open-source agent"},{category:"editor-agent",config:{appendMode:!0,path:".roo/rules/ultracite.md"},content:{differentiators:[a("Codebase-navigation focus","Roo Code shines when it understands existing project structure, which makes explicit repo standards especially valuable during exploration-heavy tasks.","FolderGit2"),a("Project-scoped rules directory","Ultracite writes into Roo Code's rules path so coding guidance stays close to the tool's own repo configuration model.","Layers"),a("Helpful for large repos","The setup works well when Roo Code is traversing many files and needs reminders about conventions, architecture, and safe edits.","BrainCircuit")],intro:"Use Ultracite with Roo Code when you want a codebase-navigation assistant to combine deep repo context with explicit implementation standards. It is especially helpful in larger repositories where understanding structure is easy, but consistent execution still needs guardrails.",metaDescription:"Configure Roo Code with Ultracite so its codebase-navigation assistant follows your repo's architecture, typing, and framework rules.",useCases:[n("Exploring large repositories","Give Roo Code a stable contract before it hops between many modules, traces behavior, and applies edits in several places."),n("Context-heavy refactors","Use committed rules when Roo Code needs to understand existing architecture before changing it."),n("Shared repo conventions","Keep Roo Code aligned with the rest of the team by storing guidance in a dedicated project rules directory.")]},description:"An AI coding assistant focused on understanding and navigating complex codebases.",id:"roo-code",logo:v1,logoFile:"roo-code.svg",name:"Roo Code",subtitle:"Codebase navigation AI"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Terminal workflow companion","Warp blends terminal usage with AI assistance, so repo-level instructions help it stay grounded while developers execute commands and iterate quickly.","Terminal"),a("Shared AGENTS.md contract","Using `AGENTS.md` lets Warp share the same repo guidance as other agent tools instead of introducing another custom file format.","Layers"),a("Fits automation-friendly shells","Ultracite works well when Warp is part of a broader automation workflow where consistency matters across many short AI interactions.","Workflow")],intro:"Use Ultracite with Warp when you want AI-assisted terminal workflows to start from a committed set of coding expectations. It is a practical fit for developers who bounce between commands, quick fixes, and lightweight agent help throughout the day.",metaDescription:"Add Ultracite to Warp through AGENTS.md so terminal AI suggestions and coding help stay aligned with your repo standards.",useCases:[n("Command-line development loops","Keep Warp aligned while you switch between shell commands, AI suggestions, and incremental code changes."),n("Shared terminal environments","Use one committed AGENTS.md file so teammates get the same guidance when they use Warp in the same repo."),n("Automation-adjacent workflows","Make repo rules explicit when Warp is part of a larger sequence of command-driven development tasks.")]},description:"A modern terminal with AI-powered command suggestions and workflow automation.",id:"warp",logo:b1,logoFile:"warp.svg",name:"Warp",subtitle:"Modern AI terminal"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Task-completion oriented","Droid focuses on completing development tasks, so a committed repo contract helps keep fast output from turning into cleanup later.","Bot"),a("Simple repo-level setup","Using `AGENTS.md` keeps the integration easy to adopt in projects where you want agent guidance without much overhead.","Command"),a("Useful for repeatable implementation work","Ultracite makes Droid a better fit for repeated task patterns where consistent standards matter more than one-off cleverness.","ShieldCheck")],intro:"Use Ultracite with Droid when you want a task-oriented coding agent to move quickly without drifting away from your repo's standards. The setup is a good fit for teams that want straightforward adoption and more predictable output from autonomous tasks.",metaDescription:"Configure Droid with Ultracite through AGENTS.md so automated coding tasks follow your repo's linting, architecture, and review standards.",useCases:[n("Repeated implementation tasks","Keep Droid aligned on bug fixes, cleanup work, and structured feature tasks that show up again and again."),n("Simple repo onboarding","Add one AGENTS.md file so Droid starts with clear instructions and contributors do not need custom local setup."),n("Review-conscious automation","Make repo standards explicit before Droid generates changes that will be inspected by humans later.")]},description:"An AI development agent focused on automated code generation and task completion.",id:"droid",logo:Ze,logoFile:"droid.svg",name:"Droid",subtitle:"Automated code generation"},{category:"open-source-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Open-source across surfaces","OpenCode spans terminal, desktop, and IDE use cases, so repo-level instructions help keep behavior stable across several working styles.","Globe"),a("Provider-agnostic environment","Because OpenCode can target many LLM providers, a committed rules file helps anchor output even when the backing model changes.","Layers"),a("Strong shared contract","AGENTS.md gives OpenCode a portable repo contract that works whether the session starts locally or in another surface.","ShieldCheck")],intro:"Use Ultracite with OpenCode when you want an open-source coding agent to carry the same repo standards across terminal, desktop, and IDE sessions. It is a useful choice for teams that care about portability and want one committed source of truth for AI guidance.",metaDescription:"Add Ultracite to OpenCode through AGENTS.md so open-source coding sessions stay consistent across terminals, desktops, IDEs, and model providers.",useCases:[n("Multi-surface development","Keep OpenCode aligned whether you start from the terminal, a desktop app, or an IDE integration."),n("Provider switching","Use one repo contract to stabilize coding behavior even if your team experiments with different LLM providers."),n("Open-source friendly workflows","Commit repo guidance so contributors can reproduce the same OpenCode behavior without hidden local setup.")]},description:"An open-source AI coding agent that runs in your terminal, desktop, or IDE with support for 75+ LLM providers.",id:"opencode",logo:f1,logoFile:"opencode.svg",name:"OpenCode",subtitle:"Open-source coding agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Charmbracelet terminal experience","Crush is built for polished terminal interactions, and a committed repo contract helps keep that experience productive rather than purely conversational.","Terminal"),a("Default AGENTS.md setup","Crush initializes projects with `AGENTS.md` by default, which makes repo guidance portable across Crush and other compatible tools.","Layers"),a("Model-flexible setup","Since Crush supports multiple models, repo rules provide the stable baseline when the underlying model changes.","Sparkles")],intro:"Use Ultracite with Crush when you want a terminal-native coding agent to feel polished without losing repo discipline. It is a good fit for developers who like model flexibility, but still want a durable project contract behind every interaction.",metaDescription:"Configure Crush with Ultracite through AGENTS.md so Charmbracelet's terminal coding agent follows your repo standards across models and sessions.",useCases:[n("Styled terminal workflows","Keep Crush productive in day-to-day shell usage by giving it committed repo standards instead of repeating guidance in prompts."),n("Model experimentation","Anchor output with one repo contract while switching among supported models inside Crush."),n("Committed project guidance","Use a shared AGENTS.md file when you want Crush and other compatible agents to inherit the same project instructions.")]},description:"Charmbracelet's glamorous AI coding agent for your terminal with multi-model support.",id:"crush",logo:Ke,logoFile:"crush.svg",name:"Crush",subtitle:"Glamorous terminal agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Coder-focused CLI","Qwen Code is built around agentic coding from natural language, so repo standards help focus that flexibility into consistent implementation decisions.","Command"),a("Portable AGENTS.md setup","The integration uses a shared repo file that is easy to commit, review, and reuse across projects.","Layers"),a("Useful for rapid iteration","Ultracite helps Qwen Code stay consistent during fast prompt-to-code loops where output quality can otherwise vary widely.","Gauge")],intro:"Use Ultracite with Qwen Code when you want a coding-focused CLI to move quickly without abandoning the repo standards your team depends on. It is a good fit for rapid iteration, natural-language tasking, and terminal-heavy development.",metaDescription:"Add Ultracite to Qwen Code through AGENTS.md so Alibaba's coding CLI follows your repo's linting, architecture, and framework standards.",useCases:[n("Fast terminal iteration","Keep Qwen Code aligned while you move quickly from prompt to patch and refine the result in the shell."),n("Natural-language tasking","Use a committed repo contract so broad natural-language requests still produce code that fits the project."),n("Portable agent setup","Reuse the same AGENTS.md pattern across repos where Qwen Code needs explicit project expectations.")]},description:"Alibaba's command-line interface for Qwen3-Coder, enabling agentic coding with natural language.",id:"qwen",logo:h1,logoFile:"qwen.svg",name:"Qwen Code",subtitle:"Alibaba's coding CLI"},{category:"terminal-agent",config:{appendMode:!0,path:".amazonq/rules/ultracite.md"},content:{differentiators:[a("AWS-aware terminal workflow","Amazon Q CLI often sits close to infrastructure and deployment tasks, so repo standards help code changes stay disciplined in a broader operational workflow.","Cloud"),a("Dedicated rules location","Ultracite uses Amazon Q's rules directory so project guidance stays clearly scoped to the tool.","FolderGit2"),a("Strong fit for full-stack repos","This setup helps when Amazon Q CLI touches application code, scripts, and cloud-adjacent files in the same repository.","Boxes")],intro:"Use Ultracite with Amazon Q CLI when you want terminal AI assistance that spans code and cloud-oriented workflows without losing repo discipline. It is especially useful in full-stack repositories where application code sits close to operational tooling.",metaDescription:"Configure Amazon Q CLI with Ultracite so AWS's terminal AI follows your repo's coding standards in full-stack and cloud-adjacent projects.",useCases:[n("Full-stack application repos","Keep Amazon Q CLI aligned when it edits frontend, backend, and support scripts in one repository."),n("Cloud-adjacent code changes","Use committed repo rules when the same workflow touches infrastructure scripts and application logic."),n("Terminal-first AWS teams","Store guidance in Amazon Q's rules directory so every contributor gets the same coding contract.")]},description:"Amazon's AI-powered CLI with command autocompletion, natural language chat, and AWS integration.",id:"amazon-q-cli",logo:Re,logoFile:"amazon-q.svg",name:"Amazon Q CLI",subtitle:"AWS's terminal AI"},{category:"ide-agent",config:{path:"firebender.json"},content:{differentiators:[a("Android Studio specialist","Firebender targets Android workflows directly, so Ultracite can complement that focus with consistent TypeScript, JavaScript, and app-adjacent frontend guidance in mixed repos.","Laptop"),a("Dedicated JSON config","The integration writes to `firebender.json`, which gives Firebender a deterministic config surface rather than a prose-based shared file.","Wrench"),a("Great for mobile product teams","Teams that ship Android apps alongside backend or web surfaces can use one repo contract to keep AI output consistent across the stack.","Building2")],faq:[{answer:"Firebender uses `firebender.json`, so Ultracite writes the repo instructions to that dedicated file instead of `AGENTS.md` or a markdown rules file.",question:"Why does Firebender use a different config file?"},{answer:"No. Firebender uses a single config file and does not expose a separate hook integration in the current Ultracite dataset.",question:"Does Firebender also support hooks?"}],intro:"Use Ultracite with Firebender when you want Android Studio AI assistance to inherit explicit repo standards from a deterministic config file. It is a particularly good fit for mobile product teams working in mixed codebases where app logic, tooling, and web surfaces live together.",metaDescription:"Configure Firebender with Ultracite through `firebender.json` so Android Studio AI assistance follows your repo's coding standards and review expectations.",useCases:[n("Android teams in mixed repos","Keep Firebender aligned when Android code, shared tooling, and supporting web or backend code live in the same repository."),n("Deterministic IDE setup","Use a dedicated JSON config file when you want AI guidance to be explicit, reviewable, and easy to diff."),n("Mobile-focused review flows","Reduce cleanup during review by giving Firebender repo-specific standards before it generates or edits code.")]},description:"The most powerful AI coding assistant for Android Studio with codebase context and up-to-date Android knowledge.",id:"firebender",logo:Xe,logoFile:"firebender.svg",name:"Firebender",subtitle:"Android Studio AI"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Cursor's terminal companion","Cursor CLI keeps the agent workflow close to the shell while still fitting into the broader Cursor ecosystem.","Terminal"),a("AGENTS.md compatibility","Cursor CLI reads `AGENTS.md`, which lets repo guidance travel cleanly between Cursor CLI and other compatible tools.","Layers"),a("Useful for repo portability","Committing `AGENTS.md` helps developers carry the same Cursor CLI behavior across checkouts and environments.","ShieldCheck")],intro:"Use Ultracite with Cursor CLI when you want terminal-based agent work to stay aligned with the same standards you expect from the wider Cursor workflow. It is a solid choice for developers who like shell-driven tasks but still want tool-native project rules.",metaDescription:"Add Ultracite to Cursor CLI through AGENTS.md so shell-driven agent runs follow your repo's coding, typing, and framework standards.",useCases:[n("Shell-driven Cursor workflows","Keep Cursor CLI aligned when you want to work in the terminal without losing the benefits of Cursor's rules system."),n("Portable repo configuration","Commit AGENTS.md so Cursor CLI behaves the same across machines and developer environments."),n("Fast task execution with guardrails","Use committed standards to make quick terminal-generated edits easier to trust and review.")]},description:"Cursor's CLI, built to help you ship right from your terminal.",id:"cursor-cli",logo:ie,logoFile:"cursor.svg",name:"Cursor CLI",subtitle:"Cursor's terminal agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Minimal terminal surface","Mistral Vibe keeps the interface lightweight, so a committed repo contract does most of the heavy lifting for consistent output.","Terminal"),a("Root-level AGENTS.md support","Mistral Vibe reads `AGENTS.md` from the workspace root, which gives the integration a simple and portable place to store coding expectations.","Layers"),a("Good for focused tasks","The setup works best when you want a small, fast coding assistant to stay disciplined on implementation details.","Gauge")],intro:"Use Ultracite with Mistral Vibe when you want a lightweight terminal coding agent to stay anchored to repo standards. It is a good fit for focused tasks where you value speed and simplicity, but still want reviewable, consistent output.",metaDescription:"Configure Mistral Vibe with Ultracite through AGENTS.md so its minimal coding CLI follows your repo's standards and quality expectations.",useCases:[n("Focused terminal tasks","Keep Mistral Vibe aligned on quick fixes and small features where speed matters but standards still matter too."),n("Lightweight repo setup","Use a shared AGENTS.md file when you want a clear, minimal config surface for coding guidance."),n("Model experiments with guardrails","Anchor output in repo rules so concise interactions still produce code that fits the project.")]},description:"Mistral's minimal CLI coding agent for streamlined development tasks.",id:"mistral-vibe",logo:c1,logoFile:"mistral.svg",name:"Mistral Vibe",subtitle:"Minimal CLI coding agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Vercel ecosystem alignment","Vercel Agent sits inside a broader deployment and platform workflow, so committed repo rules help keep AI output aligned with production expectations.","Cloud"),a("Simple AGENTS.md adoption","The integration uses a portable repo file that is easy to review, version, and share across services.","Layers"),a("Helpful for platform-connected tasks","Ultracite gives Vercel Agent a stable coding contract before it works on features that may later interact with deployment, routing, or runtime concerns.","Workflow")],intro:"Use Ultracite with Vercel Agent when you want cloud-connected coding tasks to follow the same repo standards you apply before code reaches production. It is a strong fit for teams building inside the Vercel ecosystem and shipping through fast feedback loops.",metaDescription:"Add Ultracite to Vercel Agent through AGENTS.md so cloud-connected coding tasks follow your repo's implementation and quality standards.",useCases:[n("Production-minded feature work","Keep Vercel Agent aligned when code changes are likely to move quickly from implementation into deployment workflows."),n("Platform-centric teams","Use one committed AGENTS.md file so every repo in a Vercel-heavy stack shares the same coding contract."),n("Fast feedback loops","Reduce cleanup after AI-generated changes by making standards explicit before the work reaches preview or production environments.")]},description:"Vercel's agent, powered by their AI Cloud.",id:"vercel",logo:k1,logoFile:"vercel.svg",name:"Vercel Agent",subtitle:"Vercel's AI Cloud agent"}];import P from"deepmerge";var C1="./antigravity-JVONECNW.svg";var S1="./codebuddy-OD3VECQ4.svg";var A1="./kiro-N2M256R6.svg";var z1="./trae-RXVCFBOF.svg";var U1="./void-NYH3U3BB.svg";var I1="./vscode-DEOUEB65.svg";var E1="./windsurf-5T7JOTST.svg";var T1="./zed-SIARPESF.svg";var ne={"editor.defaultFormatter":"esbenp.prettier-vscode","editor.formatOnPaste":!0,"editor.formatOnSave":!0,"emmet.showExpandedAbbreviation":"never","js/ts.tsdk.path":"node_modules/typescript/lib","js/ts.tsdk.promptToUseWorkspaceVersion":!0},eo={"[css]":{"editor.defaultFormatter":"biomejs.biome"},"[graphql]":{"editor.defaultFormatter":"biomejs.biome"},"[html]":{"editor.defaultFormatter":"biomejs.biome"},"[javascript]":{"editor.defaultFormatter":"biomejs.biome"},"[javascriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[json]":{"editor.defaultFormatter":"biomejs.biome"},"[jsonc]":{"editor.defaultFormatter":"biomejs.biome"},"[markdown]":{"editor.defaultFormatter":"biomejs.biome"},"[mdx]":{"editor.defaultFormatter":"biomejs.biome"},"[svelte]":{"editor.defaultFormatter":"biomejs.biome"},"[typescript]":{"editor.defaultFormatter":"biomejs.biome"},"[typescriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[vue]":{"editor.defaultFormatter":"biomejs.biome"},"[yaml]":{"editor.defaultFormatter":"biomejs.biome"},"editor.codeActionsOnSave":{"source.fixAll.biome":"explicit","source.organizeImports.biome":"explicit"}},to={"[css]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[graphql]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[handlebars]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[html]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[javascript]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[javascriptreact]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[json]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[jsonc]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[less]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[markdown]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[scss]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[typescript]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[typescriptreact]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[vue-html]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[vue]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[yaml]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"editor.codeActionsOnSave":{"source.fixAll.oxc":"explicit"}},oo={"editor.codeActionsOnSave":{"source.fixAll.eslint":"explicit","source.organizeImports":"explicit"}},x=(e="biome")=>{switch(e){case"biome":return P(ne,eo);case"eslint":return P(ne,oo);case"oxlint":return P(ne,to);default:return ne}},ae={format_on_save:"on",formatter:"language_server",lsp:{"typescript-language-server":{settings:{typescript:{preferences:{includePackageJsonAutoImports:"on"}}}}}},io={languages:{JavaScript:{code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0},formatter:{language_server:{name:"biome"}}},TSX:{code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0},formatter:{language_server:{name:"biome"}}},TypeScript:{code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0},formatter:{language_server:{name:"biome"}}}}},so={languages:{JavaScript:{code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0},formatter:{language_server:{name:"eslint"}}},TSX:{code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0},formatter:{language_server:{name:"eslint"}}},TypeScript:{code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0},formatter:{language_server:{name:"eslint"}}}}},no={languages:{JavaScript:{code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0},formatter:{language_server:{name:"oxfmt"}}},TSX:{code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0},formatter:{language_server:{name:"oxfmt"}}},TypeScript:{code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0},formatter:{language_server:{name:"oxfmt"}}}},lsp:{oxfmt:{initialization_options:{settings:{configPath:null,flags:{},"fmt.configPath":null,"fmt.experimental":!0,run:"onSave",typeAware:!1,unusedDisableDirectives:!1}}},oxlint:{initialization_options:{settings:{disableNestedConfig:!1,fixKind:"safe_fix",run:"onType",typeAware:!0,unusedDisableDirectives:"deny"}}}}},ao=(e="biome")=>{switch(e){case"biome":return P(ae,io);case"eslint":return P(ae,so);case"oxlint":return P(ae,no);default:return ae}},F=[{audience:"teams standardizing on the default editor across local and remote workflows",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"Microsoft's popular code editor with extensive extension support and built-in Git integration.",differentiators:[{description:"Ultracite writes predictable workspace settings that every VS Code contributor can commit and share.",title:"Commit-friendly workspace defaults"},{description:"You keep the full Visual Studio Code extension ecosystem while still getting consistent format-on-save behavior.",title:"Works with the editor your team already uses"},{description:"The generated settings stay narrow and readable, so onboarding new contributors does not require a custom editor guide.",title:"Low-friction onboarding"}],faq:[{answer:"Yes. Ultracite writes a standard .vscode/settings.json file, so the setup works well for teams that commit editor settings into the repository.",question:"Can I commit Ultracite's Visual Studio Code settings to the repo?"},{answer:"Yes. Ultracite can point Visual Studio Code at Biome, ESLint, or Oxlint while keeping format on save and auto-fix behavior consistent.",question:"Does the Visual Studio Code setup work with different Ultracite linters?"},{answer:"No. Visual Studio Code uses workspace settings only, so this page focuses on the editor config rather than extra AI rules or hook files.",question:"Does Ultracite need extra rules or hooks for plain Visual Studio Code?"}],id:"vscode",logo:I1,name:"Visual Studio Code",seo:{metaDescription:"Set up Ultracite for Visual Studio Code with a committed .vscode/settings.json, format on save, auto-fixes, and consistent linting for shared projects.",summary:"Use Ultracite to generate a clean Visual Studio Code settings file with format on save, auto-fixes, and TypeScript defaults that stay consistent across every contributor's workspace."},subtitle:"The most popular code editor",workflowHighlights:["Run `npx ultracite@latest init --editors vscode` to generate `.vscode/settings.json` for the repo.","Commit the workspace settings so every contributor inherits the same formatter and save-time fixes.","Install the matching linter extension once, then let Visual Studio Code keep the project aligned automatically."]},{audience:"Cursor users who want AI output, workspace settings, and post-edit cleanup to follow the same standards",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"The AI-first code editor built on VS Code with deep AI integration for coding assistance.",differentiators:[{description:"Cursor can use Ultracite's rule file to steer AI generations before you even reach the formatter.",title:"Guides AI output at the source"},{description:"Optional hooks let Cursor clean up generated edits immediately after the agent writes files.",title:"Pairs rules with automatic post-edit fixes"},{description:"Because Cursor is VS Code-based, you still get a familiar workspace settings model alongside AI-specific files.",title:"Keeps the VS Code ergonomics developers expect"}],faq:[{answer:"Ultracite can configure both. The workspace settings handle format-on-save behavior, while the Cursor rules file teaches the AI how you want code written.",question:"Should I use both Visual Studio Code settings and Cursor rules with Ultracite?"},{answer:"Use hooks when you want Cursor to run Ultracite automatically after AI edits. They are especially helpful if you rely heavily on agent-driven refactors.",question:"What do Cursor hooks add on top of the rules file?"},{answer:"Yes. Cursor inherits the same workspace settings model as Visual Studio Code, so your formatter and save-time fixes stay aligned with the rest of the team.",question:"Can Cursor share the same committed workspace settings as Visual Studio Code?"}],hooks:{getContent:e=>({hooks:{afterFileEdit:[{command:e}]},version:1}),path:".cursor/hooks.json"},id:"cursor",logo:ie,name:"Cursor",rules:{header:`---
|
|
125
|
+
`;var n=(e,t)=>({description:t,title:e}),a=(e,t,o)=>({description:t,icon:o,title:e});var j=[{category:"terminal-agent",config:{appendMode:!0,path:".claude/CLAUDE.md"},content:{differentiators:[a("Terminal-native workflow","Claude Code already lives in the terminal, so Ultracite guidance stays close to the commands, diffs, and review loops developers run every day.","Terminal"),a("Rules plus hooks","Claude Code is one of the few agent integrations here that can pair repo instructions with an automatic PostToolUse hook for cleanup after edits.","Workflow"),a("Long-running repo work","The integration works especially well for multi-file refactors where Claude Code needs explicit guardrails around architecture, typing, and conventions.","GitBranch")],faq:[{answer:"Ultracite writes the coding rules to `.claude/CLAUDE.md`. The optional hook config lives in `.claude/settings.json` and runs after file edits.",question:"Do I need both CLAUDE.md and settings.json?"},{answer:"The rules file is appended so you can keep existing project guidance in place. The hook config is merged separately in the settings file.",question:"Will Ultracite overwrite my existing Claude setup?"}],intro:"Use Ultracite with Claude Code when you want an agentic terminal workflow to respect the same code standards your team expects from human contributors. It is a strong fit for repo-wide edits, review loops, and autonomous tasks where consistency matters as much as speed.",metaDescription:"Configure Claude Code with Ultracite so terminal-based agent runs follow your TypeScript, React, accessibility, and performance standards from the first edit.",useCases:[n("Repo-wide refactors from the terminal","Give Claude Code clear repo instructions before it edits many files, renames APIs, or updates patterns across a monorepo."),n("Remote and SSH-heavy development","Keep standards close to terminal workflows when you work in remote environments where editor-specific settings are less useful."),n("Teams standardizing autonomous runs","Share one CLAUDE.md contract so multiple developers can run Claude Code without each session drifting into a different style.")]},description:"Anthropic's official CLI for Claude, an agentic coding tool that lives in your terminal.",hooks:{getContent:e=>({hooks:{PostToolUse:[{hooks:[{command:e,type:"command"}],matcher:"Write|Edit"}]}}),path:".claude/settings.json"},id:"claude",logo:_e,logoFile:"claude.svg",name:"Claude Code",subtitle:"Anthropic's agentic CLI"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Cloud-run task execution","Codex works asynchronously, so Ultracite gives each remote task the same repo-aware instructions without relying on local editor state.","Cloud"),a("AGENTS.md compatibility","The integration uses the same `AGENTS.md` convention many agent tools understand, making it easy to share repo guidance across systems.","Layers"),a("Clean handoffs","Codex benefits from explicit standards when tasks are delegated, reviewed later, or resumed in a fresh cloud context.","Bot")],faq:[{answer:"No. Ultracite appends its guidance to `AGENTS.md`, so you can keep broader repo notes and add coding standards in the same place.",question:"Does Codex need a separate rules file format?"},{answer:"Yes. Because Codex tasks may execute remotely, putting repo guidance in `AGENTS.md` ensures every run starts with the same shared contract.",question:"Why is AGENTS.md useful for Codex specifically?"}],intro:"Use Ultracite with Codex when you want cloud-executed development tasks to inherit the same standards you apply in local workflows. It is well suited to delegated implementation, long-running async work, and repos where handoff quality matters.",metaDescription:"Add Ultracite to Codex via AGENTS.md so OpenAI's coding agent produces repo-aware code that matches your team's linting and architecture standards.",useCases:[n("Async background implementation","Give Codex a stable repo contract before it works through larger tasks outside your interactive editor session."),n("Cross-repo standardization","Use the same AGENTS.md pattern across repositories so Codex starts every task with familiar instructions and expectations."),n("Review-heavy delivery","Reduce cleanup during review by making type safety, accessibility, and framework conventions explicit before Codex writes code.")]},description:"OpenAI's cloud-based coding agent for autonomous software development tasks.",id:"codex",logo:Je,logoFile:"codex.svg",name:"Codex",subtitle:"OpenAI's coding agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Built for background work","Jules runs asynchronously, so shared repo instructions matter more than local IDE settings or one-off chat prompts.","Clock3"),a("Low-friction setup","Jules uses `AGENTS.md`, which keeps the integration simple and portable across repos without another custom config surface.","Command"),a("Strong for queued tasks","Ultracite helps Jules keep standards intact when it works through queued fixes, migrations, or codebase chores over time.","Workflow")],intro:"Use Ultracite with Jules when you want a background coding agent to start from explicit repo standards instead of ad hoc prompts. It fits teams that queue work for async execution and still want predictable code shape when the result comes back.",metaDescription:"Configure Jules with Ultracite through AGENTS.md so Google's async coding agent returns code that matches your repo standards and review expectations.",useCases:[n("Queued maintenance work","Keep standards stable when Jules handles dependency updates, cleanup tasks, or incremental fixes in the background."),n("Distributed team handoffs","Give every async run the same instructions so results stay consistent even when different teammates trigger the work."),n("Multi-repo automation","Reuse the same AGENTS.md pattern across several codebases where Jules needs clear project-specific expectations.")]},description:"Google's asynchronous AI coding agent that works in the background to complete development tasks.",id:"jules",logo:o1,logoFile:"jules.svg",name:"Jules",subtitle:"Google's async agent"},{category:"cloud-agent",config:{appendMode:!0,path:"replit.md"},content:{differentiators:[a("Workspace-native instructions","Replit Agent already expects repo guidance in `replit.md`, so Ultracite can fit naturally into the browser workflow without introducing another config surface.","Cloud"),a("Fast prototype-to-product loop","Replit is strong for building quickly in the browser, and explicit repo rules help generated code stay maintainable once the project grows beyond a demo.","Rocket"),a("Collaborative workspace fit","Because Replit projects are often shared across teammates, a committed rules file helps keep the coding contract stable between sessions and handoffs.","Users")],intro:"Use Ultracite with Replit Agent when you want browser-based app generation to stay aligned with the same standards you expect in a maintained codebase. It is especially useful for full-stack products that start fast, but still need reviewable, team-friendly code as they evolve.",metaDescription:"Configure Replit Agent with Ultracite through replit.md so browser-based app generation follows your repo's linting, architecture, and framework standards.",useCases:[n("Browser-based full-stack building","Give Replit Agent a durable repo contract before it generates frontend, backend, and configuration code in the same workspace."),n("Prototypes that need guardrails","Keep early product iterations aligned with your team's typing, accessibility, and architecture expectations."),n("Shared cloud workspaces","Use one committed `replit.md` file so collaborators get the same coding guidance every time they open the project.")]},description:"Replit's cloud agent for building and iterating on apps directly in the browser.",id:"replit",logo:w1,logoFile:"replit.svg",name:"Replit Agent",subtitle:"Replit's cloud agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Agent-first execution","Devin is built around autonomous software work, so explicit repo rules help long-running tasks come back as reviewable changes instead of cleanup-heavy drafts.","Bot"),a("Native AGENTS.md support","Devin uses `AGENTS.md`, which keeps the integration portable and consistent with other cloud agents already in the Ultracite dataset.","Layers"),a("Strong for multi-step tasks","Persistent repo guidance helps Devin stay aligned across investigation, implementation, and follow-up passes on the same task.","Workflow")],intro:"Use Ultracite with Devin when you want delegated engineering work to stay inside a clear repo contract from the first file read to the final patch. It is a strong fit for teams assigning real implementation work and expecting the result to hold up in review.",metaDescription:"Add Ultracite to Devin through AGENTS.md so Cognition's software engineering agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Asynchronous task delegation","Give Devin a stable repo contract before it works through larger implementation tasks outside the normal interactive development loop."),n("Review-ready autonomous patches","Reduce cleanup during review by making naming, typing, and framework conventions explicit before the task starts."),n("Multi-step bug investigation","Keep standards stable while Devin traces behavior, updates code in several places, and iterates on a fix.")]},description:"Cognition's autonomous software engineering agent for completing development tasks in the background.",id:"devin",logo:Qe,logoFile:"devin.svg",name:"Devin",subtitle:"Cognition's async agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Product-focused generation","Lovable can move from prompt to working app quickly, so explicit repo rules help generated code stay maintainable once the prototype becomes a real product.","Sparkles"),a("Portable repo guidance","Using `AGENTS.md` gives Lovable a committed project contract that can live alongside other agent tools instead of hiding standards in workspace-only settings.","Layers"),a("Better prototype handoff","Ultracite helps Lovable output feel closer to team-owned production code, which makes the handoff from idea to review much smoother.","ShieldCheck")],intro:"Use Ultracite with Lovable when you want fast app generation without dropping the quality bar your team expects from maintained code. It is especially helpful when a quick prototype is likely to turn into a shipped product with ongoing review and iteration.",metaDescription:"Configure Lovable with Ultracite through AGENTS.md so AI-generated apps follow your repo's coding, architecture, and review standards from the first commit.",useCases:[n("Prompt-to-product builds","Keep Lovable aligned when a generated app moves beyond a demo and into a codebase your team will keep shipping."),n("Rapid iteration with guardrails","Make architecture, typing, and framework conventions explicit before Lovable generates new pages, flows, or backend logic."),n("Shared product experiments","Use one committed AGENTS.md file so follow-up sessions and teammates inherit the same coding expectations.")]},description:"Lovable's AI app builder for generating and iterating on full-stack products in the cloud.",id:"lovable",logo:r1,logoFile:"lovable.svg",name:"Lovable",subtitle:"Lovable's app builder"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("IDE-first guidance","Zencoder is designed to work close to the editor, so a committed `AGENTS.md` file helps steer generated edits before they become review feedback.","Monitor"),a("Portable repo contract","Using `AGENTS.md` keeps Zencoder aligned with the same repository guidance other agent tools can reuse across the stack.","Layers"),a("Useful for team handoffs","Explicit repo standards help Zencoder stay consistent when several developers bounce between the same editor-assisted workflow.","Users")],intro:"Use Ultracite with Zencoder when you want an editor-native coding agent to follow the same repo contract your team expects from human contributors. It fits best when AI-assisted edits happen close to the IDE, but still need to land cleanly in review.",metaDescription:"Configure Zencoder with Ultracite through AGENTS.md so its IDE agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Editor-assisted implementation","Guide Zencoder before it creates or edits files so the first draft already reflects your repo conventions."),n("Shared IDE workflows","Use one committed AGENTS.md file so teammates get the same coding contract in every Zencoder session."),n("Review-conscious AI edits","Reduce cleanup after editor-side generations by making typing, naming, and structure explicit upfront.")]},description:"Zencoder's IDE coding agent for generating and refining code inside the editor workflow.",id:"zencoder",logo:x1,logoFile:"zencoder.svg",name:"Zencoder",subtitle:"Zencoder's IDE agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Background-first execution","Ona is designed around delegated work, so a committed repo contract helps long-running tasks return reviewable code instead of cleanup-heavy drafts.","Cloud"),a("Shared AGENTS.md setup","Using `AGENTS.md` keeps the integration simple and portable across repositories without introducing another product-specific file.","Layers"),a("Strong for async delivery","Ultracite gives Ona a stable coding baseline before work is handed off, resumed later, or reviewed by another teammate.","Workflow")],intro:"Use Ultracite with Ona when you want cloud-executed engineering work to inherit the same repo standards your team uses locally. It is a strong fit for async delivery where handoff quality matters as much as speed.",metaDescription:"Add Ultracite to Ona through AGENTS.md so its cloud agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Delegated background work","Give Ona a durable repo contract before it works through larger implementation tasks asynchronously."),n("Multi-repo consistency","Reuse the same AGENTS.md pattern across repositories where Ona needs explicit project expectations."),n("Review-ready delivery","Reduce cleanup during review by making accessibility, naming, and architecture expectations explicit before code is written.")]},description:"Ona's cloud coding agent for asynchronous implementation and engineering tasks.",id:"ona",logo:d1,logoFile:"ona.svg",name:"Ona",subtitle:"Ona's cloud agent"},{category:"open-source-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Open-source agent gateway","OpenClaw benefits from an explicit repo contract because it can orchestrate several coding flows across an open, self-hostable stack.","Globe"),a("Portable AGENTS.md contract","Using `AGENTS.md` keeps OpenClaw aligned with a convention that is easy to commit, audit, and reuse across repos.","Layers"),a("Reproducible experiments","Committed repo guidance makes OpenClaw easier to evaluate across environments because the same standards follow every run.","ShieldCheck")],intro:"Use Ultracite with OpenClaw when you want an open-source agent stack to follow explicit repo guidance instead of relying on ad hoc prompts. It is especially useful for teams experimenting with self-hosted or reproducible AI development workflows.",metaDescription:"Configure OpenClaw with Ultracite through AGENTS.md so its open-source agent stack follows your repo's implementation and review standards.",useCases:[n("Self-hosted agent experiments","Keep OpenClaw grounded when you evaluate autonomous coding workflows in your own infrastructure."),n("Reproducible repo demos","Use a committed AGENTS.md file so contributors can see the same repo guidance every time OpenClaw runs."),n("Open-source team workflows","Share one durable coding contract so multiple users can run OpenClaw without style drift.")]},description:"An open-source agent gateway for orchestrating coding workflows with a committed repo contract.",id:"openclaw",logo:m1,logoFile:"openclaw.svg",name:"OpenClaw",subtitle:"Open-source agent gateway"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Terminal-native control","Continue can work close to terminal and automation workflows, so repo guidance helps keep broad code changes aligned with the project contract.","Terminal"),a("Simple AGENTS.md adoption","Using `AGENTS.md` gives Continue a repo-scoped instruction file that is easy to review and reuse across environments.","Layers"),a("Good for iterative agent loops","Ultracite helps Continue stay consistent during repeated investigate-edit-review cycles where drift can build up over time.","Workflow")],intro:"Use Ultracite with Continue when you want terminal-driven agent work to stay anchored to a committed repo contract. It is a practical fit for teams that want lightweight adoption without giving up reviewable code quality.",metaDescription:"Configure Continue with Ultracite through AGENTS.md so its terminal agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Terminal-heavy development","Keep Continue aligned while you switch between shell commands, repo analysis, and code generation."),n("Fast iterative fixes","Use a committed AGENTS.md file to stabilize behavior across several short agent loops in the same task."),n("Portable repo guidance","Reuse one repo contract across environments where Continue needs clear coding expectations.")]},description:"Continue's terminal coding agent for iterative implementation and repo-aware edits.",id:"continue",logo:qe,logoFile:"continue.svg",name:"Continue",subtitle:"Continue's terminal agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Data-platform context","Snowflake Cortex sits close to data and platform workflows, so explicit repo guidance helps generated code stay aligned with broader engineering standards.","Cloud"),a("Shared AGENTS.md contract","Using `AGENTS.md` keeps Cortex guidance portable and easy to commit even when code spans data, application, and operational concerns.","Layers"),a("Useful for full-stack data work","Ultracite helps Cortex produce changes that are easier to review when SQL-adjacent logic and app code live in the same repository.","Boxes")],intro:"Use Ultracite with Snowflake Cortex when you want cloud-connected code generation to respect the same repo standards your team expects across application and data-oriented work. It is especially useful where data logic and shipped code evolve together.",metaDescription:"Add Ultracite to Snowflake Cortex through AGENTS.md so cloud-connected engineering work follows your repo's coding and review standards.",useCases:[n("Data-aware application repos","Keep Cortex aligned when application code, data logic, and supporting scripts change together."),n("Platform-connected features","Use a committed repo contract before Cortex works on code that touches product and platform concerns in the same task."),n("Review-friendly data workflows","Reduce cleanup by making naming, typing, and structure explicit before cloud-generated changes reach review.")]},description:"Snowflake's cloud AI platform for engineering and data-adjacent development workflows.",id:"snowflake-cortex",logo:y1,logoFile:"snowflake-cortex.svg",name:"Snowflake Cortex",subtitle:"Snowflake's AI platform agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Framework-backed autonomy","Deepagents is built for multi-step agent flows, so explicit repo standards help each step stay aligned with the codebase contract.","Bot"),a("Portable AGENTS.md file","Using `AGENTS.md` keeps guidance close to the repo rather than hidden in agent runtime settings.","Layers"),a("Good for long task chains","Committed repo instructions help Deepagents stay consistent across research, planning, and implementation passes.","Workflow")],intro:"Use Ultracite with Deepagents when you want agentic task chains to inherit the same repo standards your team expects from direct edits. It is a good fit for multi-step work where consistency matters across several sub-tasks.",metaDescription:"Configure Deepagents with Ultracite through AGENTS.md so terminal agent workflows follow your repo's linting, architecture, and review standards.",useCases:[n("Multi-step implementation flows","Keep Deepagents aligned when one task spans research, coding, and several follow-up changes."),n("Agent framework prototypes","Use a committed repo contract while you experiment with Deepagents in real repositories."),n("Structured autonomous work","Reduce drift by giving every Deepagents run the same durable coding baseline.")]},description:"LangChain's deep agent framework for multi-step terminal-driven coding workflows.",id:"deepagents",logo:a1,logoFile:"deepagents.svg",name:"Deepagents",subtitle:"LangChain's deep agent framework"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("CLI-first coding flow","Qoder works well in terminal-centric development, so a committed repo contract helps generated patches stay aligned with local workflows.","Terminal"),a("Shared AGENTS.md setup","Using `AGENTS.md` keeps the integration portable and easy to audit when Qoder is used across several repositories.","Layers"),a("Fast prompt-to-patch loops","Ultracite gives Qoder a stable baseline during rapid iteration where output quality can otherwise vary widely.","Gauge")],intro:"Use Ultracite with Qoder when you want a fast CLI coding agent to move quickly without abandoning the repo standards your team depends on. It is a strong fit for terminal-heavy workflows and quick implementation loops.",metaDescription:"Add Ultracite to Qoder through AGENTS.md so its coding CLI follows your repo's linting, architecture, and framework standards.",useCases:[n("Fast terminal iteration","Keep Qoder aligned while you move quickly from prompt to patch and refine the result in the shell."),n("Portable repo setup","Reuse one AGENTS.md pattern across repositories where Qoder needs explicit project expectations."),n("Review-conscious generation","Make repo standards explicit before terminal-generated edits reach human review.")]},description:"Qoder's terminal coding agent for fast prompt-to-patch development loops.",id:"qoder",logo:u1,logoFile:"qoder.svg",name:"Qoder",subtitle:"Qoder's terminal agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Dedicated coding CLI","Kimi CLI is built for agentic coding from the terminal, so committed repo standards help broad natural-language tasks resolve into consistent implementation choices.","Command"),a("Portable AGENTS.md contract","The integration uses a shared repo file that is easy to commit, review, and reuse across codebases.","Layers"),a("Useful for rapid iteration","Ultracite helps Kimi CLI stay disciplined during fast prompt-driven loops where output quality can otherwise swing a lot.","Gauge")],intro:"Use Ultracite with Kimi CLI when you want a coding-focused terminal agent to move quickly without drifting away from your repo's standards. It is a practical fit for natural-language tasking and shell-first development.",metaDescription:"Configure Kimi CLI with Ultracite through AGENTS.md so its coding agent follows your repo's linting, architecture, and framework standards.",useCases:[n("Natural-language terminal tasking","Keep Kimi CLI aligned when broad prompt requests need to turn into code that still fits the project."),n("Fast fix loops","Use a committed repo contract to stabilize output during quick terminal-driven iterations."),n("Shared coding standards","Reuse one AGENTS.md file across repos where Kimi CLI needs explicit project guidance.")]},description:"Kimi's terminal coding CLI for natural-language implementation tasks.",id:"kimi-cli",logo:n1,logoFile:"kimi-cli.svg",name:"Kimi CLI",subtitle:"Kimi's coding CLI"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Cloud-based MCP workflow","MCPJam fits hosted coordination and evaluation workflows, so a committed repo contract helps keep generated changes aligned with project standards.","Cloud"),a("Shared AGENTS.md convention","Using `AGENTS.md` gives MCPJam a portable repo instruction file that works well across several projects and collaborators.","Layers"),a("Good for tool-rich experiments","Ultracite helps MCPJam stay consistent when work spans several tools, prompts, and follow-up iterations.","Workflow")],intro:"Use Ultracite with MCPJam when you want hosted, tool-connected agent workflows to follow the same repo standards your team expects elsewhere. It is especially useful when experimentation still needs a durable project contract behind it.",metaDescription:"Configure MCPJam with Ultracite through AGENTS.md so hosted agent workflows follow your repo's implementation and review standards.",useCases:[n("Tool-rich hosted workflows","Keep MCPJam aligned when a task moves across several connected tools before changes land in the repo."),n("Experimentation with guardrails","Use AGENTS.md so exploratory agent work still respects the project's coding standards."),n("Shared project contracts","Commit one repo-level file so MCPJam sessions start from the same expectations every time.")]},description:"MCPJam's cloud agent workflow for connected, repo-aware engineering tasks.",id:"mcpjam",logo:l1,logoFile:"mcpjam.svg",name:"MCPJam",subtitle:"MCPJam's cloud agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Background agent execution","Mux is built for asynchronous agent work, so explicit repo rules help the result come back reviewable and consistent.","Cloud"),a("Portable AGENTS.md setup","Using `AGENTS.md` keeps Mux aligned with a repo-level convention that is easy to version and share across workspaces.","Layers"),a("Strong for queued tasks","Ultracite helps Mux keep standards intact when several background tasks or workspaces touch the same repository over time.","Workflow")],intro:"Use Ultracite with Mux when you want background coding agents to follow the same repo standards your team expects from local development. It is a strong fit for queued work, parallel sessions, and async implementation handoffs.",metaDescription:"Add Ultracite to Mux through AGENTS.md so its background agents follow your repo's coding and review standards.",useCases:[n("Queued background implementation","Give Mux a stable repo contract before several async tasks work through the same codebase."),n("Parallel agent workspaces","Use one AGENTS.md file so multiple workspaces inherit the same standards and expectations."),n("Review-ready async delivery","Reduce cleanup by making naming, structure, and framework conventions explicit before work starts.")]},description:"Coder's background agent system for cloud-executed engineering tasks across workspaces.",id:"mux",logo:We,logoFile:"coder.svg",name:"Mux",subtitle:"Coder's background agents"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Terminal-first coding flow","Pi lives close to the shell, so a committed repo contract helps AI assistance stay disciplined while you work through real repository changes.","Terminal"),a("Simple AGENTS.md contract","Using `AGENTS.md` gives Pi a portable setup that is easy to commit and reuse across several projects.","Layers"),a("Good for focused implementation","Ultracite helps Pi stay consistent during fast prompt-to-code loops where output quality needs guardrails.","Gauge")],intro:"Use Ultracite with Pi when you want a shell-first coding agent to move quickly without drifting away from your repo standards. It is a good fit for focused terminal work and fast iteration.",metaDescription:"Configure Pi with Ultracite through AGENTS.md so its coding CLI follows your repo's linting, architecture, and framework standards.",useCases:[n("Focused terminal tasks","Keep Pi aligned on quick fixes and small features where speed matters but standards still matter too."),n("Portable repo guidance","Use one AGENTS.md file so Pi behaves consistently across different repositories and environments."),n("Prompt-driven coding loops","Anchor output in repo rules so concise interactions still produce reviewable code.")]},description:"Pi's shell-first coding CLI for focused implementation and repo-aware edits.",id:"pi",logo:g1,logoFile:"pi.svg",name:"Pi",subtitle:"Pi's coding CLI"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("CLI-oriented coding flow","AdaL fits shell-based implementation work, so explicit repo standards help prompt-driven edits stay consistent with the existing codebase.","Terminal"),a("Portable AGENTS.md contract","Using `AGENTS.md` gives AdaL a simple, shareable setup that works across repositories and contributors.","Layers"),a("Good for repeated task loops","Ultracite keeps AdaL aligned across several small implementation steps where drift can otherwise build up quickly.","Workflow")],intro:"Use Ultracite with AdaL when you want a coding CLI to stay inside a durable repo contract instead of relying on repeated prompt context. It is a good fit for shell-first development and iterative implementation work.",metaDescription:"Configure AdaL with Ultracite through AGENTS.md so its coding CLI follows your repo's linting, architecture, and framework standards.",useCases:[n("Shell-first development","Keep AdaL aligned while you move between commands, repo inspection, and generated edits in the terminal."),n("Iterative implementation loops","Use a committed repo contract to stabilize behavior across several small prompt-to-edit cycles."),n("Cross-project reuse","Reuse one AGENTS.md pattern across repos where AdaL needs explicit project expectations.")]},description:"Sylph's coding CLI for shell-first implementation and repo-aware edits.",id:"adal",logo:Oe,logoFile:"adal.svg",name:"AdaL",subtitle:"Sylph's coding CLI"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Editor-first guidance","GitHub Copilot benefits from repo instructions that shape inline completions and chat-assisted edits inside the normal development loop.","Github"),a("Shared AGENTS.md contract","Copilot can now read `AGENTS.md`, which lets teams keep one committed repo contract across Copilot and other compatible agents.","Layers"),a("Optional edit hooks","Copilot can pair instructions with a follow-up hook config, which makes it easier to auto-run fixers after AI-driven edits.","Workflow")],faq:[{answer:"Ultracite now writes Copilot guidance to `AGENTS.md`, which GitHub Copilot can read alongside other compatible tools. That keeps one shared repo contract instead of a Copilot-only file.",question:"Why does Ultracite use AGENTS.md for Copilot now?"},{answer:"If you enable hooks, Ultracite also writes `.github/hooks/ultracite.json` so post-edit fixes can run automatically after Copilot changes files.",question:"Can Copilot use hooks as well as instructions?"}],intro:"Use Ultracite with GitHub Copilot when you want inline completions, chat suggestions, and editor-side edits to stay inside your project's coding contract. It is especially useful for teams that rely on Copilot daily and want fewer stylistic cleanups during review.",metaDescription:"Set up GitHub Copilot with Ultracite via AGENTS.md so suggestions and AI-assisted edits follow your repo's formatting and framework standards.",useCases:[n("Day-to-day editor assistance","Keep Copilot's inline suggestions aligned with your repo standards while developers stay inside their normal IDE workflow."),n("Large teams using Copilot Chat","Share one AGENTS.md file so Copilot behaves consistently across many contributors, feature branches, and compatible agent tools."),n("Automated post-edit cleanup","Pair Copilot instructions with hooks when you want formatting and fix steps to run after AI edits land in the working tree.")]},description:"GitHub's AI pair programmer that suggests code completions and helps write code faster.",hooks:{getContent:e=>({hooks:{PostToolUse:[{command:e,type:"command"}]}}),path:".github/hooks/ultracite.json"},id:"copilot",logo:He,logoFile:"copilot.svg",name:"GitHub Copilot",subtitle:"GitHub's AI pair programmer"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("VS Code-native autonomous flow","Cline acts directly inside VS Code, and `AGENTS.md` lets Ultracite shape autonomous edits where developers already review and approve changes.","Monitor"),a("Portable repo guidance","Using `AGENTS.md` keeps Cline aligned with the same repository guidance other compatible agent tools can reuse.","Layers"),a("Good fit for repo exploration","Cline often works through multi-step repo tasks, and explicit standards help it make consistent decisions across repeated edits.","FolderGit2")],intro:"Use Ultracite with Cline when you want an autonomous VS Code agent to make changes that already match your repo rules. It is a practical fit for developers who approve edits in-editor and want less style drift from long multi-file sessions.",metaDescription:"Configure Cline with Ultracite through AGENTS.md so autonomous VS Code edits follow your repo's linting, React, and TypeScript standards.",useCases:[n("Autonomous edits in VS Code","Guide Cline before it creates or modifies files so the first draft already reflects your team's standards."),n("Mixed human and AI workflows","Keep repo guidance in the same tool where developers inspect diffs, accept changes, and continue iterating."),n("Cross-tool repo standards","Use one AGENTS.md file when you want Cline and other compatible agents to inherit the same coding contract.")]},description:"An autonomous coding agent for VS Code that can create and edit files, run commands, and more.",id:"cline",logo:Ve,logoFile:"cline.svg",name:"Cline",subtitle:"Autonomous VS Code agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Codebase-aware assistant","AMP is designed around understanding larger repositories, which makes explicit repo standards especially valuable during search-heavy tasks.","BrainCircuit"),a("Shared repo contract","Using `AGENTS.md` keeps Ultracite guidance portable and easy to audit when Sourcegraph-powered workflows move between repositories.","GitBranch"),a("Strong for review preparation","The setup helps AMP produce changes that are easier to review because expectations are clear before the first file is touched.","ShieldCheck")],intro:"Use Ultracite with AMP when you want a codebase-aware agent to combine semantic repo understanding with explicit implementation standards. It works best in larger projects where context retrieval is powerful, but style drift can still slow reviews down.",metaDescription:"Add Ultracite to AMP via AGENTS.md so Sourcegraph's coding agent uses repo-aware search with explicit code quality and architecture guidance.",useCases:[n("Large codebase navigation","Give AMP a stable implementation contract before it reasons across many packages, modules, or services."),n("Review-ready patches","Reduce cleanup work after search-driven edits by making naming, typing, and framework conventions explicit upfront."),n("Sourcegraph-heavy teams","Keep one repo-level instruction file for teams already leaning on Sourcegraph to answer code questions and generate fixes.")]},description:"Sourcegraph's AI coding agent that understands your entire codebase for intelligent assistance.",id:"amp",logo:Me,logoFile:"amp.svg",name:"AMP",subtitle:"Sourcegraph's coding agent"},{category:"terminal-agent",config:{path:"ultracite.md"},content:{differentiators:[a("Pair-programming cadence","Aider is conversational and iterative, so a single dedicated rules file helps every back-and-forth stay grounded in the same standards.","Terminal"),a("Dedicated config path","Aider uses `ultracite.md`, which gives the integration a focused file rather than a shared AGENTS.md document.","Command"),a("Works well with git-driven edits","Ultracite is useful when Aider is applying patches, staging changes, and iterating quickly against a repo's real history.","GitBranch")],intro:"Use Ultracite with Aider when you want terminal pair programming to stay aligned with the same repo rules you expect from direct edits. It is a natural fit for patch-based workflows, quick iterations, and developer-in-the-loop collaboration.",metaDescription:"Configure Aider with Ultracite through `ultracite.md` so terminal pair-programming sessions follow your repo's code quality and framework rules.",useCases:[n("Tight edit-review loops","Keep Aider aligned while you iterate quickly on a fix, inspect the patch, and ask for the next change."),n("Git-centric workflows","Use a dedicated rules file when Aider is operating close to commits, diffs, and staged changes."),n("Solo developer pair programming","Give Aider a persistent repo contract so it behaves consistently across multiple terminal sessions.")]},description:"AI pair programming in your terminal with support for multiple LLM providers.",id:"aider",logo:Le,logoFile:"aider.svg",name:"Aider",subtitle:"Terminal pair programming"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Cloud IDE setup","Firebase Studio runs in a hosted development environment, so repo-level rules help every workspace start with the same standards.","Cloud"),a("AGENTS.md compatibility","Firebase Studio can read `AGENTS.md`, which makes repo guidance easier to share across Studio and other compatible agent tools.","Layers"),a("Good for app stacks","The integration suits teams building full-stack apps in Firebase Studio where frontend, backend, and configuration files all need the same code quality bar.","Boxes")],intro:"Use Ultracite with Firebase Studio when you want a hosted IDE workspace to inherit the same project standards every time it boots. It is especially useful when multiple developers or generated workspaces touch the same app codebase.",metaDescription:"Set up Firebase Studio with Ultracite through AGENTS.md so Google's cloud IDE follows your repo's linting, accessibility, and performance rules from the start.",useCases:[n("Hosted app development","Give Firebase Studio a clear repo contract before it generates or edits frontend and backend code."),n("Shared cloud workspaces","Keep standards stable when several developers open the same project in a managed IDE environment."),n("Greenfield prototypes that need discipline","Add strong defaults early so generated code in a new Firebase Studio project does not drift before the team establishes habits.")]},description:"Google's AI-powered development environment integrated with Firebase services.",id:"firebase-studio",logo:Ye,logoFile:"firebase-studio.svg",name:"Firebase Studio",subtitle:"Google's cloud IDE"},{category:"open-source-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Open-source agent platform","OpenHands is designed for autonomous software work, so repo-level rules help keep generated changes aligned with human review expectations.","Bot"),a("Always-on repo guidance","Using `AGENTS.md` gives OpenHands a root-level instruction file it can keep in context across longer autonomous runs.","Layers"),a("Useful for reproducible runs","Because OpenHands can be deployed in different environments, a committed repo instruction file helps make behavior more predictable.","ShieldCheck")],intro:"Use Ultracite with OpenHands when you want an open-source autonomous agent to follow explicit project standards while it works through development tasks. The integration is a good fit for teams experimenting with reproducible agent runs in real repositories.",metaDescription:"Configure OpenHands with Ultracite through AGENTS.md so autonomous code changes stay aligned with your repo standards and review process.",useCases:[n("Autonomous task execution","Keep OpenHands grounded when it handles longer implementation tasks or explores a repository without constant human steering."),n("Open-source experimentation","Commit a clear repo instruction file so contributors testing OpenHands get consistent behavior across environments."),n("Reproducible agent demos","Use the same microagent guidance to show how OpenHands behaves in a repo before and after changes to your coding standards.")]},description:"An open-source platform for AI software development agents with autonomous capabilities.",id:"open-hands",logo:p1,logoFile:"open-hands.svg",name:"OpenHands",subtitle:"Open-source AI agents"},{category:"terminal-agent",config:{appendMode:!0,path:"GEMINI.md"},content:{differentiators:[a("Dedicated Gemini instructions","Gemini uses its own repo file, so Ultracite can tailor the setup without competing with other agent conventions.","Command"),a("Terminal-centered flow","The integration is optimized for developers who want AI help in the shell without depending on editor-specific settings.","Terminal"),a("Good cross-tool companion","Because many teams already use Gemini elsewhere, a committed repo file helps keep coding guidance consistent when they move into the CLI.","Layers")],intro:"Use Ultracite with Gemini when you want command-line AI assistance to start from a committed repo contract instead of repeating the same coding rules in prompts. It is a strong fit for teams that want a clean terminal setup with durable project guidance.",metaDescription:"Add Ultracite to Gemini through GEMINI.md so Google's terminal AI follows your repo's TypeScript, React, accessibility, and performance standards.",useCases:[n("Terminal-first development","Keep Gemini aligned while you work in the shell, inspect code, and iterate without switching into a dedicated AI editor."),n("Cross-repo consistency","Use a committed `GEMINI.md` file to keep standards stable as developers move between projects."),n("Prompt reduction","Avoid repeating architecture and style instructions every time you ask Gemini to help with a fix or refactor.")]},description:"Google's command-line interface for Gemini, bringing AI assistance to your terminal.",id:"gemini",logo:e1,logoFile:"gemini.svg",name:"Gemini",subtitle:"Google's terminal AI"},{category:"ide-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("JetBrains-native guidance","Junie lives inside the JetBrains ecosystem, so repo instructions help it work with the same precision developers expect from IDE-assisted workflows.","Laptop"),a("Portable AGENTS.md setup","Committing `AGENTS.md` means Junie can share the same repo contract as other compatible tools instead of relying on local IDE preferences alone.","Layers"),a("Useful for typed codebases","Junie is a good fit for strongly typed projects where explicit standards around TypeScript, testing, and architecture improve the quality of generated edits.","Code2")],intro:"Use Ultracite with Junie when you want JetBrains-assisted coding to follow a committed project contract instead of relying on per-user IDE habits. It is particularly helpful for typed application codebases where consistency and safe refactors matter.",metaDescription:"Configure Junie with Ultracite so JetBrains' AI agent follows your repo's code quality rules and team conventions inside the IDE.",useCases:[n("JetBrains-centered teams","Share one AGENTS.md file so Junie behaves predictably across IntelliJ, WebStorm, and other JetBrains workflows."),n("Typed refactors","Give Junie a stable contract before it updates TypeScript-heavy code or makes larger structural edits."),n("Repo onboarding","Help new contributors inherit the same IDE-side AI behavior by committing standards directly into the repo.")]},description:"JetBrains' AI coding agent integrated into their IDE ecosystem.",id:"junie",logo:i1,logoFile:"junie.svg",name:"Junie",subtitle:"JetBrains' AI agent"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Hierarchical AGENTS.md support","Augment Code can read `AGENTS.md`, which makes it easier to share repo standards across Augment and other compatible agents.","Layers"),a("Designed for collaboration","Ultracite complements Augment's team-oriented workflow by turning shared coding conventions into a committed repo asset.","Users"),a("Focused repo replacement","Because Ultracite writes the file directly, teams get a clean, deterministic rules payload instead of accumulating duplicate content over time.","ShieldCheck")],intro:"Use Ultracite with Augment Code when you want a team-oriented AI assistant to follow an explicit project ruleset stored with the repository. It fits organizations that want consistent AI output across shared development workflows and review processes.",metaDescription:"Set up Augment Code with Ultracite so its team-focused AI assistant follows committed repo rules for linting, architecture, and code quality.",useCases:[n("Shared enterprise workflows","Store a deterministic AGENTS.md file in the repo so Augment sessions across the team start from the same coding contract."),n("Code review discipline","Reduce review churn by making architecture and style expectations explicit before Augment suggests or edits code."),n("Cross-tool repo guidance","Use AGENTS.md when you want Augment and other compatible tools to inherit the same committed AI setup.")]},description:"An AI coding assistant focused on enterprise development workflows and team collaboration.",id:"augmentcode",logo:$e,logoFile:"augmentcode.svg",name:"Augment Code",subtitle:"Enterprise AI assistant"},{category:"ide-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Enterprise IDE workflows","Bob is built for teams adopting agentic coding inside the editor, with modes, governance-minded defaults, and integrations suited to large organizations.","Building2"),a("Shared AGENTS.md rules","IBM Bob reads the standard `AGENTS.md` rules file, the same format used by many AI coding tools. Ultracite writes your standards there so they work across agents.","Layers"),a("Beyond the editor","With literate coding, in-flow reviews, and Bob Shell for the terminal, a single committed contract keeps standards consistent across the surfaces where Bob works.","Workflow")],faq:[{answer:"Bob supports `.bob/rules/`, `.bobrules`, mode-specific files, global `~/.bob/rules/`, and `AGENTS.md`. Ultracite targets `AGENTS.md` so your standards are shared across Bob and other AI coding tools that read the same file.",question:"Does IBM Bob only use AGENTS.md for rules?"}],intro:"Use Ultracite with IBM Bob when you want an enterprise-focused AI coding partner in the IDE with committed rules in `AGENTS.md`. It suits organizations that combine agentic modes, editor assistance, and terminal workflows while keeping implementation rules reviewable in version control.",metaDescription:"Set up IBM Bob with Ultracite via AGENTS.md so IBM's AI assistant applies your repo's linting, TypeScript, and quality standards in the IDE.",useCases:[n("Team-wide AI standards","Commit `AGENTS.md` so every developer using Bob starts from the same coding, testing, and documentation expectations."),n("Agentic mode discipline","Give Bob explicit guardrails before it works in specialized modes or across larger refactors."),n("Editor and shell together","Keep `AGENTS.md` aligned when developers use Bob in the IDE and Bob Shell in the pipeline or locally.")]},description:"IBM's AI coding assistant for the IDE with agentic modes, literate coding, reviews, and Bob Shell for terminal workflows.",id:"bob",logo:oe,logoFile:"bob.svg",name:"IBM Bob",subtitle:"IBM's AI coding assistant"},{category:"editor-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Default AGENTS.md support","Kilo Code now supports `AGENTS.md` by default, which makes a committed repo contract the practical source of truth.","Layers"),a("Portable repo guidance","Using `AGENTS.md` keeps Kilo Code aligned with the same repository guidance other compatible agents can reuse.","FolderGit2"),a("Strong for repeatable suggestions","Explicit standards help Kilo Code produce more stable results across autocomplete, chat, and repeated editing sessions.","Sparkles")],intro:"Use Ultracite with Kilo Code when you want a configurable VS Code assistant to inherit a durable project contract instead of relying on one-off prompts. It is a good fit for teams that want repeatable AI behavior in a familiar editor workflow.",metaDescription:"Configure Kilo Code with Ultracite so customizable VS Code AI assistance follows your repo's formatting, typing, and framework conventions.",useCases:[n("Config-driven editor workflows","Keep AI behavior grounded in committed repo standards instead of per-user prompt preferences."),n("Repeatable VS Code assistance","Give Kilo Code stable rules for day-to-day suggestions, edits, and explanations inside the editor."),n("Team-managed AI setup","Store one AGENTS.md file in the repo so contributors can share one source of truth for Kilo Code behavior.")]},description:"A VS Code extension providing AI-powered coding assistance with customizable rules.",id:"kilo-code",logo:s1,logoFile:"kilo-code.svg",name:"Kilo Code",subtitle:"Customizable VS Code AI"},{category:"open-source-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Open-source terminal agent","Goose works well with committed repo guidance because it is often used by developers who want transparent, hackable agent workflows.","Terminal"),a("AGENTS.md-first discovery","Goose looks for `AGENTS.md` before `.goosehints`, which makes a shared repo contract the lightweight default.","Layers"),a("Autonomy with guardrails","The repo hints help Goose move quickly through autonomous work without losing consistency in style and structure.","ShieldCheck")],intro:"Use Ultracite with Goose when you want an open-source developer agent to work from a committed set of repo standards. It is a strong fit for terminal-heavy teams that want autonomy, but still need predictable edits and reviewable output.",metaDescription:"Add Ultracite to Goose through AGENTS.md so Block's open-source AI agent follows your repo's standards and review expectations.",useCases:[n("Terminal-heavy open-source workflows","Keep Goose aligned in repos where developers want an open toolchain and committed AI guidance."),n("Autonomous maintenance tasks","Use hints to steer Goose through repetitive fixes or cleanup work without repeating instructions in each run."),n("Experimental agent setups","Commit repo guidance so Goose behavior stays stable while you tune the rest of your local tooling.")]},description:"Block's open-source AI developer agent for autonomous software development.",id:"goose",logo:t1,logoFile:"goose.svg",name:"Goose",subtitle:"Block's open-source agent"},{category:"editor-agent",config:{appendMode:!0,path:".roo/rules/ultracite.md"},content:{differentiators:[a("Codebase-navigation focus","Roo Code shines when it understands existing project structure, which makes explicit repo standards especially valuable during exploration-heavy tasks.","FolderGit2"),a("Project-scoped rules directory","Ultracite writes into Roo Code's rules path so coding guidance stays close to the tool's own repo configuration model.","Layers"),a("Helpful for large repos","The setup works well when Roo Code is traversing many files and needs reminders about conventions, architecture, and safe edits.","BrainCircuit")],intro:"Use Ultracite with Roo Code when you want a codebase-navigation assistant to combine deep repo context with explicit implementation standards. It is especially helpful in larger repositories where understanding structure is easy, but consistent execution still needs guardrails.",metaDescription:"Configure Roo Code with Ultracite so its codebase-navigation assistant follows your repo's architecture, typing, and framework rules.",useCases:[n("Exploring large repositories","Give Roo Code a stable contract before it hops between many modules, traces behavior, and applies edits in several places."),n("Context-heavy refactors","Use committed rules when Roo Code needs to understand existing architecture before changing it."),n("Shared repo conventions","Keep Roo Code aligned with the rest of the team by storing guidance in a dedicated project rules directory.")]},description:"An AI coding assistant focused on understanding and navigating complex codebases.",id:"roo-code",logo:v1,logoFile:"roo-code.svg",name:"Roo Code",subtitle:"Codebase navigation AI"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Terminal workflow companion","Warp blends terminal usage with AI assistance, so repo-level instructions help it stay grounded while developers execute commands and iterate quickly.","Terminal"),a("Shared AGENTS.md contract","Using `AGENTS.md` lets Warp share the same repo guidance as other agent tools instead of introducing another custom file format.","Layers"),a("Fits automation-friendly shells","Ultracite works well when Warp is part of a broader automation workflow where consistency matters across many short AI interactions.","Workflow")],intro:"Use Ultracite with Warp when you want AI-assisted terminal workflows to start from a committed set of coding expectations. It is a practical fit for developers who bounce between commands, quick fixes, and lightweight agent help throughout the day.",metaDescription:"Add Ultracite to Warp through AGENTS.md so terminal AI suggestions and coding help stay aligned with your repo standards.",useCases:[n("Command-line development loops","Keep Warp aligned while you switch between shell commands, AI suggestions, and incremental code changes."),n("Shared terminal environments","Use one committed AGENTS.md file so teammates get the same guidance when they use Warp in the same repo."),n("Automation-adjacent workflows","Make repo rules explicit when Warp is part of a larger sequence of command-driven development tasks.")]},description:"A modern terminal with AI-powered command suggestions and workflow automation.",id:"warp",logo:b1,logoFile:"warp.svg",name:"Warp",subtitle:"Modern AI terminal"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Task-completion oriented","Droid focuses on completing development tasks, so a committed repo contract helps keep fast output from turning into cleanup later.","Bot"),a("Simple repo-level setup","Using `AGENTS.md` keeps the integration easy to adopt in projects where you want agent guidance without much overhead.","Command"),a("Useful for repeatable implementation work","Ultracite makes Droid a better fit for repeated task patterns where consistent standards matter more than one-off cleverness.","ShieldCheck")],intro:"Use Ultracite with Droid when you want a task-oriented coding agent to move quickly without drifting away from your repo's standards. The setup is a good fit for teams that want straightforward adoption and more predictable output from autonomous tasks.",metaDescription:"Configure Droid with Ultracite through AGENTS.md so automated coding tasks follow your repo's linting, architecture, and review standards.",useCases:[n("Repeated implementation tasks","Keep Droid aligned on bug fixes, cleanup work, and structured feature tasks that show up again and again."),n("Simple repo onboarding","Add one AGENTS.md file so Droid starts with clear instructions and contributors do not need custom local setup."),n("Review-conscious automation","Make repo standards explicit before Droid generates changes that will be inspected by humans later.")]},description:"An AI development agent focused on automated code generation and task completion.",id:"droid",logo:Ze,logoFile:"droid.svg",name:"Droid",subtitle:"Automated code generation"},{category:"open-source-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Open-source across surfaces","OpenCode spans terminal, desktop, and IDE use cases, so repo-level instructions help keep behavior stable across several working styles.","Globe"),a("Provider-agnostic environment","Because OpenCode can target many LLM providers, a committed rules file helps anchor output even when the backing model changes.","Layers"),a("Strong shared contract","AGENTS.md gives OpenCode a portable repo contract that works whether the session starts locally or in another surface.","ShieldCheck")],intro:"Use Ultracite with OpenCode when you want an open-source coding agent to carry the same repo standards across terminal, desktop, and IDE sessions. It is a useful choice for teams that care about portability and want one committed source of truth for AI guidance.",metaDescription:"Add Ultracite to OpenCode through AGENTS.md so open-source coding sessions stay consistent across terminals, desktops, IDEs, and model providers.",useCases:[n("Multi-surface development","Keep OpenCode aligned whether you start from the terminal, a desktop app, or an IDE integration."),n("Provider switching","Use one repo contract to stabilize coding behavior even if your team experiments with different LLM providers."),n("Open-source friendly workflows","Commit repo guidance so contributors can reproduce the same OpenCode behavior without hidden local setup.")]},description:"An open-source AI coding agent that runs in your terminal, desktop, or IDE with support for 75+ LLM providers.",id:"opencode",logo:f1,logoFile:"opencode.svg",name:"OpenCode",subtitle:"Open-source coding agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Charmbracelet terminal experience","Crush is built for polished terminal interactions, and a committed repo contract helps keep that experience productive rather than purely conversational.","Terminal"),a("Default AGENTS.md setup","Crush initializes projects with `AGENTS.md` by default, which makes repo guidance portable across Crush and other compatible tools.","Layers"),a("Model-flexible setup","Since Crush supports multiple models, repo rules provide the stable baseline when the underlying model changes.","Sparkles")],intro:"Use Ultracite with Crush when you want a terminal-native coding agent to feel polished without losing repo discipline. It is a good fit for developers who like model flexibility, but still want a durable project contract behind every interaction.",metaDescription:"Configure Crush with Ultracite through AGENTS.md so Charmbracelet's terminal coding agent follows your repo standards across models and sessions.",useCases:[n("Styled terminal workflows","Keep Crush productive in day-to-day shell usage by giving it committed repo standards instead of repeating guidance in prompts."),n("Model experimentation","Anchor output with one repo contract while switching among supported models inside Crush."),n("Committed project guidance","Use a shared AGENTS.md file when you want Crush and other compatible agents to inherit the same project instructions.")]},description:"Charmbracelet's glamorous AI coding agent for your terminal with multi-model support.",id:"crush",logo:Ke,logoFile:"crush.svg",name:"Crush",subtitle:"Glamorous terminal agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Coder-focused CLI","Qwen Code is built around agentic coding from natural language, so repo standards help focus that flexibility into consistent implementation decisions.","Command"),a("Portable AGENTS.md setup","The integration uses a shared repo file that is easy to commit, review, and reuse across projects.","Layers"),a("Useful for rapid iteration","Ultracite helps Qwen Code stay consistent during fast prompt-to-code loops where output quality can otherwise vary widely.","Gauge")],intro:"Use Ultracite with Qwen Code when you want a coding-focused CLI to move quickly without abandoning the repo standards your team depends on. It is a good fit for rapid iteration, natural-language tasking, and terminal-heavy development.",metaDescription:"Add Ultracite to Qwen Code through AGENTS.md so Alibaba's coding CLI follows your repo's linting, architecture, and framework standards.",useCases:[n("Fast terminal iteration","Keep Qwen Code aligned while you move quickly from prompt to patch and refine the result in the shell."),n("Natural-language tasking","Use a committed repo contract so broad natural-language requests still produce code that fits the project."),n("Portable agent setup","Reuse the same AGENTS.md pattern across repos where Qwen Code needs explicit project expectations.")]},description:"Alibaba's command-line interface for Qwen3-Coder, enabling agentic coding with natural language.",id:"qwen",logo:h1,logoFile:"qwen.svg",name:"Qwen Code",subtitle:"Alibaba's coding CLI"},{category:"terminal-agent",config:{appendMode:!0,path:".amazonq/rules/ultracite.md"},content:{differentiators:[a("AWS-aware terminal workflow","Amazon Q CLI often sits close to infrastructure and deployment tasks, so repo standards help code changes stay disciplined in a broader operational workflow.","Cloud"),a("Dedicated rules location","Ultracite uses Amazon Q's rules directory so project guidance stays clearly scoped to the tool.","FolderGit2"),a("Strong fit for full-stack repos","This setup helps when Amazon Q CLI touches application code, scripts, and cloud-adjacent files in the same repository.","Boxes")],intro:"Use Ultracite with Amazon Q CLI when you want terminal AI assistance that spans code and cloud-oriented workflows without losing repo discipline. It is especially useful in full-stack repositories where application code sits close to operational tooling.",metaDescription:"Configure Amazon Q CLI with Ultracite so AWS's terminal AI follows your repo's coding standards in full-stack and cloud-adjacent projects.",useCases:[n("Full-stack application repos","Keep Amazon Q CLI aligned when it edits frontend, backend, and support scripts in one repository."),n("Cloud-adjacent code changes","Use committed repo rules when the same workflow touches infrastructure scripts and application logic."),n("Terminal-first AWS teams","Store guidance in Amazon Q's rules directory so every contributor gets the same coding contract.")]},description:"Amazon's AI-powered CLI with command autocompletion, natural language chat, and AWS integration.",id:"amazon-q-cli",logo:Re,logoFile:"amazon-q.svg",name:"Amazon Q CLI",subtitle:"AWS's terminal AI"},{category:"ide-agent",config:{path:"firebender.json"},content:{differentiators:[a("Android Studio specialist","Firebender targets Android workflows directly, so Ultracite can complement that focus with consistent TypeScript, JavaScript, and app-adjacent frontend guidance in mixed repos.","Laptop"),a("Dedicated JSON config","The integration writes to `firebender.json`, which gives Firebender a deterministic config surface rather than a prose-based shared file.","Wrench"),a("Great for mobile product teams","Teams that ship Android apps alongside backend or web surfaces can use one repo contract to keep AI output consistent across the stack.","Building2")],faq:[{answer:"Firebender uses `firebender.json`, so Ultracite writes the repo instructions to that dedicated file instead of `AGENTS.md` or a markdown rules file.",question:"Why does Firebender use a different config file?"},{answer:"No. Firebender uses a single config file and does not expose a separate hook integration in the current Ultracite dataset.",question:"Does Firebender also support hooks?"}],intro:"Use Ultracite with Firebender when you want Android Studio AI assistance to inherit explicit repo standards from a deterministic config file. It is a particularly good fit for mobile product teams working in mixed codebases where app logic, tooling, and web surfaces live together.",metaDescription:"Configure Firebender with Ultracite through `firebender.json` so Android Studio AI assistance follows your repo's coding standards and review expectations.",useCases:[n("Android teams in mixed repos","Keep Firebender aligned when Android code, shared tooling, and supporting web or backend code live in the same repository."),n("Deterministic IDE setup","Use a dedicated JSON config file when you want AI guidance to be explicit, reviewable, and easy to diff."),n("Mobile-focused review flows","Reduce cleanup during review by giving Firebender repo-specific standards before it generates or edits code.")]},description:"The most powerful AI coding assistant for Android Studio with codebase context and up-to-date Android knowledge.",id:"firebender",logo:Xe,logoFile:"firebender.svg",name:"Firebender",subtitle:"Android Studio AI"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Cursor's terminal companion","Cursor CLI keeps the agent workflow close to the shell while still fitting into the broader Cursor ecosystem.","Terminal"),a("AGENTS.md compatibility","Cursor CLI reads `AGENTS.md`, which lets repo guidance travel cleanly between Cursor CLI and other compatible tools.","Layers"),a("Useful for repo portability","Committing `AGENTS.md` helps developers carry the same Cursor CLI behavior across checkouts and environments.","ShieldCheck")],intro:"Use Ultracite with Cursor CLI when you want terminal-based agent work to stay aligned with the same standards you expect from the wider Cursor workflow. It is a solid choice for developers who like shell-driven tasks but still want tool-native project rules.",metaDescription:"Add Ultracite to Cursor CLI through AGENTS.md so shell-driven agent runs follow your repo's coding, typing, and framework standards.",useCases:[n("Shell-driven Cursor workflows","Keep Cursor CLI aligned when you want to work in the terminal without losing the benefits of Cursor's rules system."),n("Portable repo configuration","Commit AGENTS.md so Cursor CLI behaves the same across machines and developer environments."),n("Fast task execution with guardrails","Use committed standards to make quick terminal-generated edits easier to trust and review.")]},description:"Cursor's CLI, built to help you ship right from your terminal.",id:"cursor-cli",logo:ie,logoFile:"cursor.svg",name:"Cursor CLI",subtitle:"Cursor's terminal agent"},{category:"terminal-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Minimal terminal surface","Mistral Vibe keeps the interface lightweight, so a committed repo contract does most of the heavy lifting for consistent output.","Terminal"),a("Root-level AGENTS.md support","Mistral Vibe reads `AGENTS.md` from the workspace root, which gives the integration a simple and portable place to store coding expectations.","Layers"),a("Good for focused tasks","The setup works best when you want a small, fast coding assistant to stay disciplined on implementation details.","Gauge")],intro:"Use Ultracite with Mistral Vibe when you want a lightweight terminal coding agent to stay anchored to repo standards. It is a good fit for focused tasks where you value speed and simplicity, but still want reviewable, consistent output.",metaDescription:"Configure Mistral Vibe with Ultracite through AGENTS.md so its minimal coding CLI follows your repo's standards and quality expectations.",useCases:[n("Focused terminal tasks","Keep Mistral Vibe aligned on quick fixes and small features where speed matters but standards still matter too."),n("Lightweight repo setup","Use a shared AGENTS.md file when you want a clear, minimal config surface for coding guidance."),n("Model experiments with guardrails","Anchor output in repo rules so concise interactions still produce code that fits the project.")]},description:"Mistral's minimal CLI coding agent for streamlined development tasks.",id:"mistral-vibe",logo:c1,logoFile:"mistral.svg",name:"Mistral Vibe",subtitle:"Minimal CLI coding agent"},{category:"cloud-agent",config:{appendMode:!0,path:"AGENTS.md"},content:{differentiators:[a("Vercel ecosystem alignment","Vercel Agent sits inside a broader deployment and platform workflow, so committed repo rules help keep AI output aligned with production expectations.","Cloud"),a("Simple AGENTS.md adoption","The integration uses a portable repo file that is easy to review, version, and share across services.","Layers"),a("Helpful for platform-connected tasks","Ultracite gives Vercel Agent a stable coding contract before it works on features that may later interact with deployment, routing, or runtime concerns.","Workflow")],intro:"Use Ultracite with Vercel Agent when you want cloud-connected coding tasks to follow the same repo standards you apply before code reaches production. It is a strong fit for teams building inside the Vercel ecosystem and shipping through fast feedback loops.",metaDescription:"Add Ultracite to Vercel Agent through AGENTS.md so cloud-connected coding tasks follow your repo's implementation and quality standards.",useCases:[n("Production-minded feature work","Keep Vercel Agent aligned when code changes are likely to move quickly from implementation into deployment workflows."),n("Platform-centric teams","Use one committed AGENTS.md file so every repo in a Vercel-heavy stack shares the same coding contract."),n("Fast feedback loops","Reduce cleanup after AI-generated changes by making standards explicit before the work reaches preview or production environments.")]},description:"Vercel's agent, powered by their AI Cloud.",id:"vercel",logo:k1,logoFile:"vercel.svg",name:"Vercel Agent",subtitle:"Vercel's AI Cloud agent"}];import P from"deepmerge";var C1="./antigravity-JVONECNW.svg";var S1="./codebuddy-OD3VECQ4.svg";var A1="./kiro-N2M256R6.svg";var z1="./trae-RXVCFBOF.svg";var U1="./void-NYH3U3BB.svg";var I1="./vscode-DEOUEB65.svg";var E1="./windsurf-5T7JOTST.svg";var j1="./zed-SIARPESF.svg";var ne={"editor.defaultFormatter":"esbenp.prettier-vscode","editor.formatOnPaste":!0,"editor.formatOnSave":!0,"emmet.showExpandedAbbreviation":"never","js/ts.tsdk.path":"node_modules/typescript/lib","js/ts.tsdk.promptToUseWorkspaceVersion":!0},to={"[css]":{"editor.defaultFormatter":"biomejs.biome"},"[graphql]":{"editor.defaultFormatter":"biomejs.biome"},"[html]":{"editor.defaultFormatter":"biomejs.biome"},"[javascript]":{"editor.defaultFormatter":"biomejs.biome"},"[javascriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[json]":{"editor.defaultFormatter":"biomejs.biome"},"[jsonc]":{"editor.defaultFormatter":"biomejs.biome"},"[markdown]":{"editor.defaultFormatter":"biomejs.biome"},"[mdx]":{"editor.defaultFormatter":"biomejs.biome"},"[svelte]":{"editor.defaultFormatter":"biomejs.biome"},"[typescript]":{"editor.defaultFormatter":"biomejs.biome"},"[typescriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[vue]":{"editor.defaultFormatter":"biomejs.biome"},"[yaml]":{"editor.defaultFormatter":"biomejs.biome"},"editor.codeActionsOnSave":{"source.fixAll.biome":"explicit","source.organizeImports.biome":"explicit"}},oo={"[css]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[graphql]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[handlebars]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[html]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[javascript]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[javascriptreact]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[json]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[jsonc]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[less]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[markdown]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[scss]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[typescript]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[typescriptreact]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[vue-html]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[vue]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"[yaml]":{"editor.defaultFormatter":"oxc.oxc-vscode"},"editor.codeActionsOnSave":{"source.fixAll.oxc":"explicit"}},io={"editor.codeActionsOnSave":{"source.fixAll.eslint":"explicit","source.organizeImports":"explicit"}},x=(e="biome")=>{switch(e){case"biome":return P(ne,to);case"eslint":return P(ne,io);case"oxlint":return P(ne,oo);default:return ne}},ae={format_on_save:"on",formatter:"language_server",lsp:{"typescript-language-server":{settings:{typescript:{preferences:{includePackageJsonAutoImports:"on"}}}}}},so={languages:{JavaScript:{code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0},formatter:{language_server:{name:"biome"}}},TSX:{code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0},formatter:{language_server:{name:"biome"}}},TypeScript:{code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0},formatter:{language_server:{name:"biome"}}}}},no={languages:{JavaScript:{code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0},formatter:{language_server:{name:"eslint"}}},TSX:{code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0},formatter:{language_server:{name:"eslint"}}},TypeScript:{code_actions_on_format:{"source.fixAll.eslint":!0,"source.organizeImports.eslint":!0},formatter:{language_server:{name:"eslint"}}}}},ao={languages:{JavaScript:{code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0},formatter:{language_server:{name:"oxfmt"}}},TSX:{code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0},formatter:{language_server:{name:"oxfmt"}}},TypeScript:{code_actions_on_format:{"source.fixAll.oxc":!0,"source.organizeImports.oxc":!0},formatter:{language_server:{name:"oxfmt"}}}},lsp:{oxfmt:{initialization_options:{settings:{configPath:null,flags:{},"fmt.configPath":null,"fmt.experimental":!0,run:"onSave",typeAware:!1,unusedDisableDirectives:!1}}},oxlint:{initialization_options:{settings:{disableNestedConfig:!1,fixKind:"safe_fix",run:"onType",typeAware:!0,unusedDisableDirectives:"deny"}}}}},ro=(e="biome")=>{switch(e){case"biome":return P(ae,so);case"eslint":return P(ae,no);case"oxlint":return P(ae,ao);default:return ae}},F=[{audience:"teams standardizing on the default editor across local and remote workflows",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"Microsoft's popular code editor with extensive extension support and built-in Git integration.",differentiators:[{description:"Ultracite writes predictable workspace settings that every VS Code contributor can commit and share.",title:"Commit-friendly workspace defaults"},{description:"You keep the full Visual Studio Code extension ecosystem while still getting consistent format-on-save behavior.",title:"Works with the editor your team already uses"},{description:"The generated settings stay narrow and readable, so onboarding new contributors does not require a custom editor guide.",title:"Low-friction onboarding"}],faq:[{answer:"Yes. Ultracite writes a standard .vscode/settings.json file, so the setup works well for teams that commit editor settings into the repository.",question:"Can I commit Ultracite's Visual Studio Code settings to the repo?"},{answer:"Yes. Ultracite can point Visual Studio Code at Biome, ESLint, or Oxlint while keeping format on save and auto-fix behavior consistent.",question:"Does the Visual Studio Code setup work with different Ultracite linters?"},{answer:"No. Visual Studio Code uses workspace settings only, so this page focuses on the editor config rather than extra AI rules or hook files.",question:"Does Ultracite need extra rules or hooks for plain Visual Studio Code?"}],id:"vscode",logo:I1,name:"Visual Studio Code",seo:{metaDescription:"Set up Ultracite for Visual Studio Code with a committed .vscode/settings.json, format on save, auto-fixes, and consistent linting for shared projects.",summary:"Use Ultracite to generate a clean Visual Studio Code settings file with format on save, auto-fixes, and TypeScript defaults that stay consistent across every contributor's workspace."},subtitle:"The most popular code editor",workflowHighlights:["Run `npx ultracite@latest init --editors vscode` to generate `.vscode/settings.json` for the repo.","Commit the workspace settings so every contributor inherits the same formatter and save-time fixes.","Install the matching linter extension once, then let Visual Studio Code keep the project aligned automatically."]},{audience:"Cursor users who want AI output, workspace settings, and post-edit cleanup to follow the same standards",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"The AI-first code editor built on VS Code with deep AI integration for coding assistance.",differentiators:[{description:"Cursor can use Ultracite's rule file to steer AI generations before you even reach the formatter.",title:"Guides AI output at the source"},{description:"Optional hooks let Cursor clean up generated edits immediately after the agent writes files.",title:"Pairs rules with automatic post-edit fixes"},{description:"Because Cursor is VS Code-based, you still get a familiar workspace settings model alongside AI-specific files.",title:"Keeps the VS Code ergonomics developers expect"}],faq:[{answer:"Ultracite can configure both. The workspace settings handle format-on-save behavior, while the Cursor rules file teaches the AI how you want code written.",question:"Should I use both Visual Studio Code settings and Cursor rules with Ultracite?"},{answer:"Use hooks when you want Cursor to run Ultracite automatically after AI edits. They are especially helpful if you rely heavily on agent-driven refactors.",question:"What do Cursor hooks add on top of the rules file?"},{answer:"Yes. Cursor inherits the same workspace settings model as Visual Studio Code, so your formatter and save-time fixes stay aligned with the rest of the team.",question:"Can Cursor share the same committed workspace settings as Visual Studio Code?"}],hooks:{getContent:e=>({hooks:{afterFileEdit:[{command:e}]},version:1}),path:".cursor/hooks.json"},id:"cursor",logo:ie,name:"Cursor",rules:{header:`---
|
|
126
126
|
description: Ultracite Rules - AI-Ready Formatter and Linter
|
|
127
127
|
globs: "**/*.{ts,tsx,js,jsx,json,jsonc,html,vue,svelte,astro,css,yaml,yml,graphql,gql,md,mdx,grit}"
|
|
128
128
|
alwaysApply: false
|
|
129
|
-
---`,path:".cursor/rules/ultracite.mdc"},seo:{metaDescription:"Configure Ultracite for Cursor with shared VS Code settings, a `.cursor/rules/ultracite.mdc` file, and optional post-edit hooks.",summary:"Cursor works best with Ultracite when you combine committed workspace settings, a dedicated Cursor rules file, and optional post-edit hooks that run after AI-driven changes land in your repo."},subtitle:"The AI-first code editor",workflowHighlights:["Generate the shared `.vscode/settings.json` file so Cursor inherits the same formatter and save behavior as the rest of the repo.","Add `.cursor/rules/ultracite.mdc` so Cursor generates code that already matches Ultracite's expectations.","Enable `.cursor/hooks.json` when you want Ultracite to run after AI edits and clean up formatting or auto-fixable issues immediately."]},{audience:"Windsurf teams leaning on agentic edits and wanting automated cleanup after every write",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"Codeium's agentic IDE that combines AI assistance with a powerful VS Code-based development environment.",differentiators:[{description:"Windsurf's agentic workflow benefits from a dedicated rules file plus a hook that can run right after generated edits land.",title:"Built for post-write automation"},{description:"Ultracite keeps Windsurf aligned with standard VS Code workspace settings instead of forcing a separate editor-only config path.",title:"Reuses the same workspace configuration as VS Code"},{description:"The combination of rules and hooks reduces the amount of cleanup you need after Codeium agents make broad file changes.",title:"Keeps agent-driven edits reviewable"}],faq:[{answer:"The rules file shapes how Windsurf writes code, while the hooks file lets Ultracite run after agent edits to fix what is still auto-fixable.",question:"Why would I use both Windsurf rules and hooks?"},{answer:"Yes. Windsurf is VS Code-based, so the generated `.vscode/settings.json` remains the main workspace settings file for editor behavior.",question:"Does Windsurf still use the same workspace settings file as Visual Studio Code?"},{answer:"The hook helps when Windsurf agents touch many files at once because Ultracite can normalize formatting and safe fixes immediately after the write step.",question:"When are Windsurf hooks most useful?"}],hooks:{getContent:e=>({hooks:{post_write_code:[{command:e,show_output:!0}]}}),path:".windsurf/hooks.json"},id:"windsurf",logo:E1,name:"Windsurf",rules:{path:".windsurf/rules/ultracite.md"},seo:{metaDescription:"Set up Ultracite for Windsurf with shared VS Code settings, a `.windsurf/rules/ultracite.md` file, and optional post-write hooks.",summary:"Use Ultracite with Windsurf to pair standard VS Code workspace settings with Windsurf-specific rules and optional hooks that tidy AI-generated edits after every write."},subtitle:"The agentic IDE by Codeium",workflowHighlights:["Start with the shared `.vscode/settings.json` so Windsurf follows the repo's formatter and save-time fixes.","Add `.windsurf/rules/ultracite.md` to steer Codeium agents toward Ultracite's code standards before they write code.","Turn on `.windsurf/hooks.json` if you want Ultracite to run automatically after Windsurf finishes writing files."]},{audience:"CodeBuddy teams who want shared workspace defaults, a committed memory file, and automated cleanup after AI edits",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"Tencent Cloud CodeBuddy is a next-generation AI code editor powered by the Tencent Yuanbao Code large model.",differentiators:[{description:"CodeBuddy can pair shared VS Code-style workspace settings with both a branded memory file and project-level hooks, so editor behavior and AI cleanup stay aligned in one repo contract.",title:"Combines memory, settings, and hooks"},{description:"Using `CODEBUDDY.md` makes repo guidance explicit before CodeBuddy generates code, while hooks in `.codebuddy/settings.json` can clean up what is still auto-fixable after edits land.",title:"Covers both pre- and post-edit quality"},{description:"The setup stays familiar for teams already standardizing on `.vscode/settings.json`, which keeps onboarding simple even in an AI-heavy editor.",title:"Fits existing VS Code-style collaboration"}],faq:[{answer:"The workspace settings control format on save and code actions, `CODEBUDDY.md` gives CodeBuddy repo-level instructions for how generated code should look, and `.codebuddy/settings.json` can run Ultracite automatically after AI edits.",question:"Why does the CodeBuddy setup use settings, CODEBUDDY.md, and hooks?"},{answer:"Yes. Ultracite keeps the shared `.vscode/settings.json` file as the baseline so CodeBuddy can stay aligned with teammates using other VS Code-style editors.",question:"Can CodeBuddy share the same committed workspace settings as other editors?"},{answer:"The memory file shapes how CodeBuddy writes code up front, while the hook config lets Ultracite run after `Write` and `Edit` actions so formatting and safe fixes happen automatically.",question:"What do CodeBuddy hooks add on top of CODEBUDDY.md?"}],hooks:{getContent:e=>({hooks:{PostToolUse:[{hooks:[{command:e,timeout:20,type:"command"}],matcher:"Write|Edit"}]}}),path:".codebuddy/settings.json"},id:"codebuddy",logo:S1,name:"CodeBuddy",rules:{appendMode:!0,path:"CODEBUDDY.md"},seo:{metaDescription:"Configure Ultracite for CodeBuddy with shared VS Code settings, a `CODEBUDDY.md` memory file, and optional `.codebuddy/settings.json` hooks.",summary:"CodeBuddy works best with Ultracite when you combine committed workspace settings, a branded project memory file, and optional PostToolUse hooks that clean up AI edits after they land."},subtitle:"Tencent Cloud's AI code editor",workflowHighlights:["Generate `.vscode/settings.json` so CodeBuddy follows the same formatter, code actions, and TypeScript defaults as the rest of the repo.","Add `CODEBUDDY.md` to give CodeBuddy a committed memory file that reflects Ultracite's coding standards.","Enable `.codebuddy/settings.json` when you want Ultracite to run after CodeBuddy `Write` and `Edit` actions and clean up AI-generated changes automatically."]},{audience:"teams evaluating Google's AI IDE while keeping the same familiar VS Code workspace contract",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"An AI-powered development platform built on VS Code for building and deploying applications faster.",differentiators:[{description:"Antigravity can stay on the same committed `.vscode/settings.json` contract as the rest of a mixed-editor team.",title:"Easy to standardize during tool evaluation"},{description:"Ultracite keeps format-on-save and auto-fixes predictable while teams experiment with Antigravity's AI-driven workflows.",title:"Stability while trying a new AI IDE"},{description:"The setup is intentionally lightweight, which makes Antigravity a good fit for teams that want consistency without extra editor-specific files.",title:"Simple setup with minimal moving parts"}],faq:[{answer:"Yes. Antigravity uses the same `.vscode/settings.json` approach as other VS Code-based editors, which makes migration straightforward.",question:"Can Antigravity use the same workspace settings as Visual Studio Code?"},{answer:"Ultracite keeps the integration focused on the committed editor settings. If Antigravity-specific AI rule surfaces mature later, you can add them without changing the core workspace config.",question:"Does Ultracite need extra Antigravity-specific rule files today?"},{answer:"Teams piloting Antigravity alongside Visual Studio Code or Cursor can standardize on the same workspace defaults and reduce editor drift during the transition.",question:"Who benefits most from the Antigravity setup?"}],id:"antigravity",logo:C1,name:"Antigravity",seo:{metaDescription:"Configure Ultracite for Antigravity with shared VS Code settings so format on save, auto-fixes, and repo defaults stay aligned.",summary:"Antigravity can plug into the same Ultracite-managed Visual Studio Code settings file, making it easy to evaluate Google's AI IDE without inventing a second configuration story for your team."},subtitle:"Google's next-generation IDE",workflowHighlights:["Generate `.vscode/settings.json` so Antigravity uses the same formatter and code actions as the rest of the repository.","Commit the workspace config to keep Antigravity pilots aligned with teammates who still use Visual Studio Code or Cursor.","Use the shared editor settings as the baseline, then layer Antigravity-specific workflow experiments on top without changing repo-level standards."]},{audience:"IBM Bob teams who want VS Code-style workspace defaults plus committed rules in `AGENTS.md` for IBM's AI coding assistant",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"IBM's AI coding assistant for the IDE, built for agentic modes, literate coding, and enterprise workflows alongside familiar editor ergonomics.",differentiators:[{description:"IBM Bob reads `AGENTS.md`, the same rules file used by many AI coding tools. Ultracite writes your standards there so they work across agents while staying version-controlled.",title:"Shared AGENTS.md rules"},{description:"Ultracite still targets the normal `.vscode/settings.json` surface, so format on save, the linter extension, and TypeScript defaults behave like other VS Code\u2013compatible editors.",title:"Same workspace settings story as Visual Studio Code"},{description:"You can combine editor behavior (settings) with Bob's guidance file so AI output and human edits meet the same bar before review.",title:"Editor defaults plus AI rules in one repo"}],faq:[{answer:"`--editors bob` updates `.vscode/settings.json`. `--agents bob` creates or appends `AGENTS.md` with Ultracite's coding rules. Use both when you want formatter defaults and Bob-readable project standards in one pass.",question:"Should I run Ultracite with both `--editors bob` and `--agents bob`?"},{answer:"Bob supports `.bob/rules/`, `.bobrules`, mode-specific files, and `AGENTS.md`. Ultracite targets `AGENTS.md` so your standards are shared across Bob and other AI coding tools that read the same file.",question:"Does Bob only read AGENTS.md for workspace rules?"},{answer:"Bob is distributed as its own IDE experience; when it remains compatible with the VS Code settings and extension model, the same Biome, ESLint, or Oxlint extension install path applies as for Cursor or Windsurf.",question:"Is the Visual Studio Code extension install step the same for IBM Bob?"}],id:"bob",logo:oe,name:"IBM Bob",rules:{appendMode:!0,path:"AGENTS.md"},seo:{metaDescription:"Wire Ultracite to IBM Bob with `.vscode/settings.json` and `AGENTS.md` so IBM's AI follows formatters, linters, and repo coding standards.",summary:"IBM Bob works well with Ultracite when you pair shared Visual Studio Code workspace settings with `AGENTS.md` rules\u2014matching the standard format while keeping editor behavior predictable."},subtitle:"IBM's AI coding assistant",workflowHighlights:["Run `npx ultracite@latest init --editors bob` to generate `.vscode/settings.json` and the linter extension defaults Bob-compatible editors expect.","Run with `--agents bob` (or init both) to append `AGENTS.md` so Bob picks up Ultracite standards from the shared rules file.","Optionally add extra files under `.bob/rules/` for Bob-specific instructions that complement `AGENTS.md`."]},{audience:"Kiro users who want spec-driven AI workflows to inherit repo rules before code generation starts",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"AWS's spec-driven AI development environment for building production-ready applications.",differentiators:[{description:"Kiro can read an Ultracite steering file, which makes it a strong fit for teams that rely on spec-first development.",title:"Steering files match Kiro's planning model"},{description:"Ultracite still anchors the day-to-day editor behavior in a normal VS Code settings file, so workspace expectations stay familiar.",title:"Spec-driven guidance without losing standard editor defaults"},{description:"The steering file helps Kiro generate code that already reflects your repo conventions instead of relying only on after-the-fact fixes.",title:"Moves quality earlier in the workflow"}],faq:[{answer:"The settings file handles editor behavior like format on save, while the steering file gives Kiro higher-level repo guidance before it starts implementing a task.",question:"How does Kiro's steering file differ from the normal editor settings?"},{answer:"Yes. Kiro still benefits from the shared `.vscode/settings.json`, so human edits and AI-assisted edits follow the same formatter and code action defaults.",question:"Should I still commit the Visual Studio Code settings for Kiro?"},{answer:"Teams using Kiro for structured task planning, specs, or implementation outlines usually get the most value because the steering file reinforces repo-wide standards during that planning step.",question:"Who is the Kiro setup best suited for?"}],id:"kiro",logo:A1,name:"Kiro",rules:{path:".kiro/steering/ultracite.md"},seo:{metaDescription:"Set up Ultracite for Kiro with `.vscode/settings.json` plus a `.kiro/steering/ultracite.md` steering file so spec-driven AI work follows your repo standards.",summary:"Kiro pairs well with Ultracite when you combine shared VS Code workspace settings with a dedicated steering file that guides spec-driven AI work before code is generated."},subtitle:"AWS's spec-driven IDE",workflowHighlights:["Use `.vscode/settings.json` to keep Kiro's editor behavior aligned with the rest of the repository.","Add `.kiro/steering/ultracite.md` so Kiro sees Ultracite's code standards while turning specs into implementation work.","Treat the steering file as durable repo guidance and update it alongside broader changes to your coding standards."]},{audience:"Trae users who want a dedicated AI rules file without losing the simplicity of VS Code workspace settings",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"ByteDance's AI-powered IDE built on VS Code - the real AI engineer.",differentiators:[{description:"Trae can read a project rules file, so Ultracite can influence generated code before review instead of only after save.",title:"Project rules keep Trae aligned with repo standards"},{description:"The integration stays lightweight because Trae still relies on the same committed VS Code settings pattern as other VS Code-based editors.",title:"Simple repo setup for an AI-heavy IDE"},{description:"Ultracite helps Trae produce code that is easier to review by combining up-front guidance with save-time fixes.",title:"Balances generation quality with reliable formatting"}],faq:[{answer:"The workspace settings control formatter behavior, while `.trae/rules/project_rules.md` gives Trae repo-level guidance for how code should be written.",question:"Why does the Trae setup use both Visual Studio Code settings and a project rules file?"},{answer:"Yes. Because Trae is built on VS Code, the committed workspace settings remain the most important shared editor configuration for the team.",question:"Can Trae share the same committed settings file as Visual Studio Code and Cursor?"},{answer:"Trae teams that lean heavily on agent-generated code usually benefit the most because the project rules file reduces the amount of style cleanup needed after generation.",question:"When does the Trae project rules file matter most?"}],id:"trae",logo:z1,name:"Trae",rules:{path:".trae/rules/project_rules.md"},seo:{metaDescription:"Configure Ultracite for Trae with shared VS Code settings and a `.trae/rules/project_rules.md` file for AI-generated code.",summary:"Trae works well with Ultracite when you keep the standard VS Code workspace settings in place and add a dedicated project rules file that teaches the AI how your repo expects code to look."},subtitle:"ByteDance's AI IDE",workflowHighlights:["Generate `.vscode/settings.json` so Trae follows the same formatter, code actions, and TypeScript defaults as the rest of the repo.","Create `.trae/rules/project_rules.md` to give Trae project-level instructions that reflect Ultracite's standards.","Review the rules file whenever your team's coding expectations change so Trae stays aligned before it generates code."]},{audience:"developers choosing an open-source AI editor and wanting a privacy-friendly setup with minimal repo overhead",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"An open-source AI code editor built on VS Code with a focus on privacy and extensibility.",differentiators:[{description:"Void keeps the setup transparent because Ultracite only needs the committed workspace settings file to deliver consistent save-time behavior.",title:"Lightweight and auditable"},{description:"Teams can standardize on an open-source editor without giving up the same VS Code-based config pattern used elsewhere in the stack.",title:"Open-source editor, familiar configuration model"},{description:"The minimal integration is a good fit for privacy-conscious teams that want fewer editor-specific files in the repository.",title:"Good default for privacy-focused workflows"}],faq:[{answer:"Yes. Void uses the same `.vscode/settings.json` model, so Ultracite can configure it with the same shared workspace file used by other VS Code-based editors.",question:"Can Void use the same workspace settings as Visual Studio Code?"},{answer:"The setup intentionally stays simple. Ultracite focuses on the committed editor settings so teams can keep repo overhead low while still enforcing consistent formatting and fixes.",question:"Why does the Void integration stay focused on the settings file?"},{answer:"Teams that prefer open-source tooling, want a transparent integration surface, or are cautious about extra editor-specific config files tend to get the most value.",question:"Who is the Void setup a strong fit for?"}],id:"void",logo:U1,name:"Void",seo:{metaDescription:"Use Ultracite with Void through shared VS Code settings so format on save, auto-fixes, and repo defaults stay consistent.",summary:"Void fits Ultracite well if you want an open-source AI editor that still uses the familiar VS Code workspace settings model for formatting, lint fixes, and consistent team defaults."},subtitle:"Open-source AI editor",workflowHighlights:["Generate `.vscode/settings.json` so Void inherits the same formatter and save-time fixes as the rest of the repo.","Commit the workspace settings to keep Void aligned with teammates using Visual Studio Code, Cursor, or other VS Code-based editors.","Use the lean setup as a baseline, then layer Void-specific extensions or workflows on top without changing repo-level standards."]},{audience:"Zed users who want a native, high-performance editor without giving up shared repo conventions",config:{getContent:ao,path:".zed/settings.json"},description:"A high-performance, multiplayer code editor built in Rust with built-in AI assistance.",differentiators:[{description:"Zed uses its own native settings file, so Ultracite can tailor the setup to Zed instead of pretending every editor is a VS Code clone.",title:"Native configuration for a native editor"},{description:"Ultracite's `.rules` file works well with Zed's append-mode workflow, letting you keep existing instructions and add standards incrementally.",title:"Append-mode rules fit iterative teams"},{description:"The setup supports fast local editing, multiplayer sessions, and AI assistance without forcing a separate VS Code compatibility layer.",title:"Keeps Zed's performance-focused workflow intact"}],faq:[{answer:"Zed uses `.zed/settings.json` for editor behavior and a `.rules` file for repo guidance, so the setup is intentionally different from VS Code-based editors.",question:"How is the Zed setup different from Visual Studio Code-based editors?"},{answer:"Append mode means Ultracite can add its rules to the existing `.rules` file without replacing everything that is already there, which is helpful for teams layering repo guidance over time.",question:"Why does Zed use append mode for the rules file?"},{answer:"Teams that care about editor responsiveness, native tooling, or collaborative editing tend to benefit most from keeping Zed's native config model intact while still standardizing on Ultracite.",question:"Who is the Zed setup best for?"}],id:"zed",logo:T1,name:"Zed",rules:{appendMode:!0,path:".rules"},seo:{metaDescription:"Configure Ultracite for Zed with native `.zed/settings.json` defaults and an appendable `.rules` file for shared repo standards.",summary:"Zed uses a native Ultracite setup with `.zed/settings.json` for editor behavior and an appendable `.rules` file for repo guidance, making it a strong fit for teams that want speed without config drift."},subtitle:"The high-performance editor",workflowHighlights:["Generate `.zed/settings.json` so Zed handles formatting, code actions, and TypeScript behavior the way Ultracite expects.","Append Ultracite guidance into `.rules` so Zed keeps any existing repo instructions and gains a shared coding standard layer.","Use the native Zed files as the source of truth instead of trying to mirror a VS Code setup in a different editor model."]}];var ro=e=>!!e.hooks,lo=e=>!!e.hooks,co=()=>F.filter(ro).map(e=>({hooks:e.hooks,id:e.id,name:e.name})),po=()=>T.filter(lo).map(e=>({hooks:e.hooks,id:e.id,name:e.name})),$=[...co(),...po()];var j1="./biome-TVLEY2T4.svg";var G1="./eslint-7IULJKW7.svg";var B1="./oxlint-5IE3ABOZ.svg";var D1="./prettier-O4V2FSEA.svg";var P1="./stylelint-DEBSWZVS.svg";var re=[{benefits:[{description:"Written in Rust, Biome can format a large codebase in milliseconds.",icon:"Zap",title:"Lightning fast"},{description:"No more juggling ESLint, Prettier, and other tools. Biome handles formatting and linting in a single pass.",icon:"Layers",title:"All-in-one toolchain"},{description:"Covers accessibility, complexity, correctness, performance, security, style, and suspicious patterns.",icon:"ShieldCheck",title:"287 preconfigured rules"},{description:"Natively supports JavaScript, TypeScript, JSX, TSX, JSON, JSONC, CSS, GraphQL, and HTML.",icon:"Code",title:"Multi-language support"},{description:"Automatically organizes imports and JSX attributes, plus sorts Tailwind CSS classes.",icon:"ArrowUpDown",title:"Smart sorting"},{description:"Biome has no JavaScript dependencies. One binary does everything with consistent behavior.",icon:"Package",title:"Zero dependencies"}],configFiles:[{code:e=>`{
|
|
129
|
+
---`,path:".cursor/rules/ultracite.mdc"},seo:{metaDescription:"Configure Ultracite for Cursor with shared VS Code settings, a `.cursor/rules/ultracite.mdc` file, and optional post-edit hooks.",summary:"Cursor works best with Ultracite when you combine committed workspace settings, a dedicated Cursor rules file, and optional post-edit hooks that run after AI-driven changes land in your repo."},subtitle:"The AI-first code editor",workflowHighlights:["Generate the shared `.vscode/settings.json` file so Cursor inherits the same formatter and save behavior as the rest of the repo.","Add `.cursor/rules/ultracite.mdc` so Cursor generates code that already matches Ultracite's expectations.","Enable `.cursor/hooks.json` when you want Ultracite to run after AI edits and clean up formatting or auto-fixable issues immediately."]},{audience:"Windsurf teams leaning on agentic edits and wanting automated cleanup after every write",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"Codeium's agentic IDE that combines AI assistance with a powerful VS Code-based development environment.",differentiators:[{description:"Windsurf's agentic workflow benefits from a dedicated rules file plus a hook that can run right after generated edits land.",title:"Built for post-write automation"},{description:"Ultracite keeps Windsurf aligned with standard VS Code workspace settings instead of forcing a separate editor-only config path.",title:"Reuses the same workspace configuration as VS Code"},{description:"The combination of rules and hooks reduces the amount of cleanup you need after Codeium agents make broad file changes.",title:"Keeps agent-driven edits reviewable"}],faq:[{answer:"The rules file shapes how Windsurf writes code, while the hooks file lets Ultracite run after agent edits to fix what is still auto-fixable.",question:"Why would I use both Windsurf rules and hooks?"},{answer:"Yes. Windsurf is VS Code-based, so the generated `.vscode/settings.json` remains the main workspace settings file for editor behavior.",question:"Does Windsurf still use the same workspace settings file as Visual Studio Code?"},{answer:"The hook helps when Windsurf agents touch many files at once because Ultracite can normalize formatting and safe fixes immediately after the write step.",question:"When are Windsurf hooks most useful?"}],hooks:{getContent:e=>({hooks:{post_write_code:[{command:e,show_output:!0}]}}),path:".windsurf/hooks.json"},id:"windsurf",logo:E1,name:"Windsurf",rules:{path:".windsurf/rules/ultracite.md"},seo:{metaDescription:"Set up Ultracite for Windsurf with shared VS Code settings, a `.windsurf/rules/ultracite.md` file, and optional post-write hooks.",summary:"Use Ultracite with Windsurf to pair standard VS Code workspace settings with Windsurf-specific rules and optional hooks that tidy AI-generated edits after every write."},subtitle:"The agentic IDE by Codeium",workflowHighlights:["Start with the shared `.vscode/settings.json` so Windsurf follows the repo's formatter and save-time fixes.","Add `.windsurf/rules/ultracite.md` to steer Codeium agents toward Ultracite's code standards before they write code.","Turn on `.windsurf/hooks.json` if you want Ultracite to run automatically after Windsurf finishes writing files."]},{audience:"CodeBuddy teams who want shared workspace defaults, a committed memory file, and automated cleanup after AI edits",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"Tencent Cloud CodeBuddy is a next-generation AI code editor powered by the Tencent Yuanbao Code large model.",differentiators:[{description:"CodeBuddy can pair shared VS Code-style workspace settings with both a branded memory file and project-level hooks, so editor behavior and AI cleanup stay aligned in one repo contract.",title:"Combines memory, settings, and hooks"},{description:"Using `CODEBUDDY.md` makes repo guidance explicit before CodeBuddy generates code, while hooks in `.codebuddy/settings.json` can clean up what is still auto-fixable after edits land.",title:"Covers both pre- and post-edit quality"},{description:"The setup stays familiar for teams already standardizing on `.vscode/settings.json`, which keeps onboarding simple even in an AI-heavy editor.",title:"Fits existing VS Code-style collaboration"}],faq:[{answer:"The workspace settings control format on save and code actions, `CODEBUDDY.md` gives CodeBuddy repo-level instructions for how generated code should look, and `.codebuddy/settings.json` can run Ultracite automatically after AI edits.",question:"Why does the CodeBuddy setup use settings, CODEBUDDY.md, and hooks?"},{answer:"Yes. Ultracite keeps the shared `.vscode/settings.json` file as the baseline so CodeBuddy can stay aligned with teammates using other VS Code-style editors.",question:"Can CodeBuddy share the same committed workspace settings as other editors?"},{answer:"The memory file shapes how CodeBuddy writes code up front, while the hook config lets Ultracite run after `Write` and `Edit` actions so formatting and safe fixes happen automatically.",question:"What do CodeBuddy hooks add on top of CODEBUDDY.md?"}],hooks:{getContent:e=>({hooks:{PostToolUse:[{hooks:[{command:e,timeout:20,type:"command"}],matcher:"Write|Edit"}]}}),path:".codebuddy/settings.json"},id:"codebuddy",logo:S1,name:"CodeBuddy",rules:{appendMode:!0,path:"CODEBUDDY.md"},seo:{metaDescription:"Configure Ultracite for CodeBuddy with shared VS Code settings, a `CODEBUDDY.md` memory file, and optional `.codebuddy/settings.json` hooks.",summary:"CodeBuddy works best with Ultracite when you combine committed workspace settings, a branded project memory file, and optional PostToolUse hooks that clean up AI edits after they land."},subtitle:"Tencent Cloud's AI code editor",workflowHighlights:["Generate `.vscode/settings.json` so CodeBuddy follows the same formatter, code actions, and TypeScript defaults as the rest of the repo.","Add `CODEBUDDY.md` to give CodeBuddy a committed memory file that reflects Ultracite's coding standards.","Enable `.codebuddy/settings.json` when you want Ultracite to run after CodeBuddy `Write` and `Edit` actions and clean up AI-generated changes automatically."]},{audience:"teams evaluating Google's AI IDE while keeping the same familiar VS Code workspace contract",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"An AI-powered development platform built on VS Code for building and deploying applications faster.",differentiators:[{description:"Antigravity can stay on the same committed `.vscode/settings.json` contract as the rest of a mixed-editor team.",title:"Easy to standardize during tool evaluation"},{description:"Ultracite keeps format-on-save and auto-fixes predictable while teams experiment with Antigravity's AI-driven workflows.",title:"Stability while trying a new AI IDE"},{description:"The setup is intentionally lightweight, which makes Antigravity a good fit for teams that want consistency without extra editor-specific files.",title:"Simple setup with minimal moving parts"}],faq:[{answer:"Yes. Antigravity uses the same `.vscode/settings.json` approach as other VS Code-based editors, which makes migration straightforward.",question:"Can Antigravity use the same workspace settings as Visual Studio Code?"},{answer:"Ultracite keeps the integration focused on the committed editor settings. If Antigravity-specific AI rule surfaces mature later, you can add them without changing the core workspace config.",question:"Does Ultracite need extra Antigravity-specific rule files today?"},{answer:"Teams piloting Antigravity alongside Visual Studio Code or Cursor can standardize on the same workspace defaults and reduce editor drift during the transition.",question:"Who benefits most from the Antigravity setup?"}],id:"antigravity",logo:C1,name:"Antigravity",seo:{metaDescription:"Configure Ultracite for Antigravity with shared VS Code settings so format on save, auto-fixes, and repo defaults stay aligned.",summary:"Antigravity can plug into the same Ultracite-managed Visual Studio Code settings file, making it easy to evaluate Google's AI IDE without inventing a second configuration story for your team."},subtitle:"Google's next-generation IDE",workflowHighlights:["Generate `.vscode/settings.json` so Antigravity uses the same formatter and code actions as the rest of the repository.","Commit the workspace config to keep Antigravity pilots aligned with teammates who still use Visual Studio Code or Cursor.","Use the shared editor settings as the baseline, then layer Antigravity-specific workflow experiments on top without changing repo-level standards."]},{audience:"IBM Bob teams who want VS Code-style workspace defaults plus committed rules in `AGENTS.md` for IBM's AI coding assistant",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"IBM's AI coding assistant for the IDE, built for agentic modes, literate coding, and enterprise workflows alongside familiar editor ergonomics.",differentiators:[{description:"IBM Bob reads `AGENTS.md`, the same rules file used by many AI coding tools. Ultracite writes your standards there so they work across agents while staying version-controlled.",title:"Shared AGENTS.md rules"},{description:"Ultracite still targets the normal `.vscode/settings.json` surface, so format on save, the linter extension, and TypeScript defaults behave like other VS Code\u2013compatible editors.",title:"Same workspace settings story as Visual Studio Code"},{description:"You can combine editor behavior (settings) with Bob's guidance file so AI output and human edits meet the same bar before review.",title:"Editor defaults plus AI rules in one repo"}],faq:[{answer:"`--editors bob` updates `.vscode/settings.json`. `--agents bob` creates or appends `AGENTS.md` with Ultracite's coding rules. Use both when you want formatter defaults and Bob-readable project standards in one pass.",question:"Should I run Ultracite with both `--editors bob` and `--agents bob`?"},{answer:"Bob supports `.bob/rules/`, `.bobrules`, mode-specific files, and `AGENTS.md`. Ultracite targets `AGENTS.md` so your standards are shared across Bob and other AI coding tools that read the same file.",question:"Does Bob only read AGENTS.md for workspace rules?"},{answer:"Bob is distributed as its own IDE experience; when it remains compatible with the VS Code settings and extension model, the same Biome, ESLint, or Oxlint extension install path applies as for Cursor or Windsurf.",question:"Is the Visual Studio Code extension install step the same for IBM Bob?"}],id:"bob",logo:oe,name:"IBM Bob",rules:{appendMode:!0,path:"AGENTS.md"},seo:{metaDescription:"Wire Ultracite to IBM Bob with `.vscode/settings.json` and `AGENTS.md` so IBM's AI follows formatters, linters, and repo coding standards.",summary:"IBM Bob works well with Ultracite when you pair shared Visual Studio Code workspace settings with `AGENTS.md` rules\u2014matching the standard format while keeping editor behavior predictable."},subtitle:"IBM's AI coding assistant",workflowHighlights:["Run `npx ultracite@latest init --editors bob` to generate `.vscode/settings.json` and the linter extension defaults Bob-compatible editors expect.","Run with `--agents bob` (or init both) to append `AGENTS.md` so Bob picks up Ultracite standards from the shared rules file.","Optionally add extra files under `.bob/rules/` for Bob-specific instructions that complement `AGENTS.md`."]},{audience:"Kiro users who want spec-driven AI workflows to inherit repo rules before code generation starts",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"AWS's spec-driven AI development environment for building production-ready applications.",differentiators:[{description:"Kiro can read an Ultracite steering file, which makes it a strong fit for teams that rely on spec-first development.",title:"Steering files match Kiro's planning model"},{description:"Ultracite still anchors the day-to-day editor behavior in a normal VS Code settings file, so workspace expectations stay familiar.",title:"Spec-driven guidance without losing standard editor defaults"},{description:"The steering file helps Kiro generate code that already reflects your repo conventions instead of relying only on after-the-fact fixes.",title:"Moves quality earlier in the workflow"}],faq:[{answer:"The settings file handles editor behavior like format on save, while the steering file gives Kiro higher-level repo guidance before it starts implementing a task.",question:"How does Kiro's steering file differ from the normal editor settings?"},{answer:"Yes. Kiro still benefits from the shared `.vscode/settings.json`, so human edits and AI-assisted edits follow the same formatter and code action defaults.",question:"Should I still commit the Visual Studio Code settings for Kiro?"},{answer:"Teams using Kiro for structured task planning, specs, or implementation outlines usually get the most value because the steering file reinforces repo-wide standards during that planning step.",question:"Who is the Kiro setup best suited for?"}],id:"kiro",logo:A1,name:"Kiro",rules:{path:".kiro/steering/ultracite.md"},seo:{metaDescription:"Set up Ultracite for Kiro with `.vscode/settings.json` plus a `.kiro/steering/ultracite.md` steering file so spec-driven AI work follows your repo standards.",summary:"Kiro pairs well with Ultracite when you combine shared VS Code workspace settings with a dedicated steering file that guides spec-driven AI work before code is generated."},subtitle:"AWS's spec-driven IDE",workflowHighlights:["Use `.vscode/settings.json` to keep Kiro's editor behavior aligned with the rest of the repository.","Add `.kiro/steering/ultracite.md` so Kiro sees Ultracite's code standards while turning specs into implementation work.","Treat the steering file as durable repo guidance and update it alongside broader changes to your coding standards."]},{audience:"Trae users who want a dedicated AI rules file without losing the simplicity of VS Code workspace settings",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"ByteDance's AI-powered IDE built on VS Code - the real AI engineer.",differentiators:[{description:"Trae can read a project rules file, so Ultracite can influence generated code before review instead of only after save.",title:"Project rules keep Trae aligned with repo standards"},{description:"The integration stays lightweight because Trae still relies on the same committed VS Code settings pattern as other VS Code-based editors.",title:"Simple repo setup for an AI-heavy IDE"},{description:"Ultracite helps Trae produce code that is easier to review by combining up-front guidance with save-time fixes.",title:"Balances generation quality with reliable formatting"}],faq:[{answer:"The workspace settings control formatter behavior, while `.trae/rules/project_rules.md` gives Trae repo-level guidance for how code should be written.",question:"Why does the Trae setup use both Visual Studio Code settings and a project rules file?"},{answer:"Yes. Because Trae is built on VS Code, the committed workspace settings remain the most important shared editor configuration for the team.",question:"Can Trae share the same committed settings file as Visual Studio Code and Cursor?"},{answer:"Trae teams that lean heavily on agent-generated code usually benefit the most because the project rules file reduces the amount of style cleanup needed after generation.",question:"When does the Trae project rules file matter most?"}],id:"trae",logo:z1,name:"Trae",rules:{path:".trae/rules/project_rules.md"},seo:{metaDescription:"Configure Ultracite for Trae with shared VS Code settings and a `.trae/rules/project_rules.md` file for AI-generated code.",summary:"Trae works well with Ultracite when you keep the standard VS Code workspace settings in place and add a dedicated project rules file that teaches the AI how your repo expects code to look."},subtitle:"ByteDance's AI IDE",workflowHighlights:["Generate `.vscode/settings.json` so Trae follows the same formatter, code actions, and TypeScript defaults as the rest of the repo.","Create `.trae/rules/project_rules.md` to give Trae project-level instructions that reflect Ultracite's standards.","Review the rules file whenever your team's coding expectations change so Trae stays aligned before it generates code."]},{audience:"developers choosing an open-source AI editor and wanting a privacy-friendly setup with minimal repo overhead",config:{extensionCommand:"code --install-extension",getContent:x,path:".vscode/settings.json"},description:"An open-source AI code editor built on VS Code with a focus on privacy and extensibility.",differentiators:[{description:"Void keeps the setup transparent because Ultracite only needs the committed workspace settings file to deliver consistent save-time behavior.",title:"Lightweight and auditable"},{description:"Teams can standardize on an open-source editor without giving up the same VS Code-based config pattern used elsewhere in the stack.",title:"Open-source editor, familiar configuration model"},{description:"The minimal integration is a good fit for privacy-conscious teams that want fewer editor-specific files in the repository.",title:"Good default for privacy-focused workflows"}],faq:[{answer:"Yes. Void uses the same `.vscode/settings.json` model, so Ultracite can configure it with the same shared workspace file used by other VS Code-based editors.",question:"Can Void use the same workspace settings as Visual Studio Code?"},{answer:"The setup intentionally stays simple. Ultracite focuses on the committed editor settings so teams can keep repo overhead low while still enforcing consistent formatting and fixes.",question:"Why does the Void integration stay focused on the settings file?"},{answer:"Teams that prefer open-source tooling, want a transparent integration surface, or are cautious about extra editor-specific config files tend to get the most value.",question:"Who is the Void setup a strong fit for?"}],id:"void",logo:U1,name:"Void",seo:{metaDescription:"Use Ultracite with Void through shared VS Code settings so format on save, auto-fixes, and repo defaults stay consistent.",summary:"Void fits Ultracite well if you want an open-source AI editor that still uses the familiar VS Code workspace settings model for formatting, lint fixes, and consistent team defaults."},subtitle:"Open-source AI editor",workflowHighlights:["Generate `.vscode/settings.json` so Void inherits the same formatter and save-time fixes as the rest of the repo.","Commit the workspace settings to keep Void aligned with teammates using Visual Studio Code, Cursor, or other VS Code-based editors.","Use the lean setup as a baseline, then layer Void-specific extensions or workflows on top without changing repo-level standards."]},{audience:"Zed users who want a native, high-performance editor without giving up shared repo conventions",config:{getContent:ro,path:".zed/settings.json"},description:"A high-performance, multiplayer code editor built in Rust with built-in AI assistance.",differentiators:[{description:"Zed uses its own native settings file, so Ultracite can tailor the setup to Zed instead of pretending every editor is a VS Code clone.",title:"Native configuration for a native editor"},{description:"Ultracite's `.rules` file works well with Zed's append-mode workflow, letting you keep existing instructions and add standards incrementally.",title:"Append-mode rules fit iterative teams"},{description:"The setup supports fast local editing, multiplayer sessions, and AI assistance without forcing a separate VS Code compatibility layer.",title:"Keeps Zed's performance-focused workflow intact"}],faq:[{answer:"Zed uses `.zed/settings.json` for editor behavior and a `.rules` file for repo guidance, so the setup is intentionally different from VS Code-based editors.",question:"How is the Zed setup different from Visual Studio Code-based editors?"},{answer:"Append mode means Ultracite can add its rules to the existing `.rules` file without replacing everything that is already there, which is helpful for teams layering repo guidance over time.",question:"Why does Zed use append mode for the rules file?"},{answer:"Teams that care about editor responsiveness, native tooling, or collaborative editing tend to benefit most from keeping Zed's native config model intact while still standardizing on Ultracite.",question:"Who is the Zed setup best for?"}],id:"zed",logo:j1,name:"Zed",rules:{appendMode:!0,path:".rules"},seo:{metaDescription:"Configure Ultracite for Zed with native `.zed/settings.json` defaults and an appendable `.rules` file for shared repo standards.",summary:"Zed uses a native Ultracite setup with `.zed/settings.json` for editor behavior and an appendable `.rules` file for repo guidance, making it a strong fit for teams that want speed without config drift."},subtitle:"The high-performance editor",workflowHighlights:["Generate `.zed/settings.json` so Zed handles formatting, code actions, and TypeScript behavior the way Ultracite expects.","Append Ultracite guidance into `.rules` so Zed keeps any existing repo instructions and gains a shared coding standard layer.","Use the native Zed files as the source of truth instead of trying to mirror a VS Code setup in a different editor model."]}];var lo=e=>!!e.hooks,co=e=>!!e.hooks,po=()=>F.filter(lo).map(e=>({hooks:e.hooks,id:e.id,name:e.name})),mo=()=>j.filter(co).map(e=>({hooks:e.hooks,id:e.id,name:e.name})),$=[...po(),...mo()];var T1="./biome-TVLEY2T4.svg";var G1="./eslint-7IULJKW7.svg";var B1="./oxlint-5IE3ABOZ.svg";var D1="./prettier-O4V2FSEA.svg";var P1="./stylelint-DEBSWZVS.svg";var re=[{benefits:[{description:"Written in Rust, Biome can format a large codebase in milliseconds.",icon:"Zap",title:"Lightning fast"},{description:"No more juggling ESLint, Prettier, and other tools. Biome handles formatting and linting in a single pass.",icon:"Layers",title:"All-in-one toolchain"},{description:"Covers accessibility, complexity, correctness, performance, security, style, and suspicious patterns.",icon:"ShieldCheck",title:"287 preconfigured rules"},{description:"Natively supports JavaScript, TypeScript, JSX, TSX, JSON, JSONC, CSS, GraphQL, and HTML.",icon:"Code",title:"Multi-language support"},{description:"Automatically organizes imports and JSX attributes, plus sorts Tailwind CSS classes.",icon:"ArrowUpDown",title:"Smart sorting"},{description:"Biome has no JavaScript dependencies. One binary does everything with consistent behavior.",icon:"Package",title:"Zero dependencies"}],configFiles:[{code:e=>`{
|
|
130
130
|
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
|
|
131
131
|
"extends": [
|
|
132
132
|
${e.map(t=>`"ultracite/biome/${t}"`).join(`,
|
|
133
133
|
`)}
|
|
134
134
|
]
|
|
135
|
-
}`,lang:"json",name:"biome.jsonc"}],description:"The modern, all-in-one toolchain. Biome is a fast formatter and linter written in Rust that handles JavaScript, TypeScript, JSON, CSS, and more with a single tool.",id:"biome",logo:
|
|
135
|
+
}`,lang:"json",name:"biome.jsonc"}],description:"The modern, all-in-one toolchain. Biome is a fast formatter and linter written in Rust that handles JavaScript, TypeScript, JSON, CSS, and more with a single tool.",id:"biome",logo:T1,name:"Biome",subtitle:"The modern all-in-one toolchain",videos:["https://www.youtube.com/watch?v=lEkXbneUnWg","https://www.youtube.com/watch?v=b_F4LaycQcE"],vscodeExtensionId:"biomejs.biome"},{additionalLogos:[{alt:"Prettier",src:D1},{alt:"Stylelint",src:P1}],benefits:[{description:"Used by millions of developers worldwide. The largest ecosystem of plugins and configurations available.",icon:"ShieldCheck",title:"Battle-tested"},{description:"React, TypeScript, JSX A11y, Import, Promise, Node, Next.js, Unicorn, SonarJS, and more preconfigured.",icon:"Puzzle",title:"20+ plugins included"},{description:"ESLint handles code quality, Prettier ensures consistent formatting, and Stylelint keeps your CSS clean.",icon:"Layers",title:"Three tools in one"},{description:"First-class support for React, Next.js, Vue, Svelte, and more with framework-specific rules.",icon:"Box",title:"Framework-aware"},{description:"Deep TypeScript integration with type-aware rules that catch bugs static analysis alone can't find.",icon:"FileCode",title:"Type-aware linting"},{description:"Hundreds of rules covering accessibility, security, performance, and best practices out of the box.",icon:"Target",title:"Maximum coverage"}],configFiles:[{code:e=>`import { defineConfig } from "eslint/config";
|
|
136
136
|
${e.map(t=>`import ${t} from "ultracite/eslint/${t}";`).join(`
|
|
137
137
|
`)}
|
|
138
138
|
|
|
@@ -145,9 +145,12 @@ export default defineConfig([
|
|
|
145
145
|
},
|
|
146
146
|
]);`,lang:"javascript",name:"eslint.config.mjs"},{code:()=>'export { default } from "ultracite/prettier";',lang:"javascript",name:"prettier.config.mjs"},{code:()=>'export { default } from "ultracite/stylelint";',lang:"javascript",name:"stylelint.config.mjs"}],description:"The most mature and comprehensive linting solution. Combines ESLint for JavaScript/TypeScript, Prettier for formatting, and Stylelint for CSS with 20+ plugins and hundreds of preconfigured rules.",id:"eslint",includes:["ESLint","Prettier","Stylelint"],logo:G1,name:"ESLint + Prettier + Stylelint",subtitle:"The most mature linting ecosystem",vscodeExtensionId:"dbaeumer.vscode-eslint"},{benefits:[{description:"Lint your entire codebase in milliseconds. No more waiting for slow linting processes.",icon:"Zap",title:"50-100x faster"},{description:"Built-in support for React, TypeScript, Next.js, Vue, Jest, Vitest, JSDoc, and more without extra deps.",icon:"Puzzle",title:"15 plugin equivalents"},{description:"Prioritizes catching real bugs over stylistic issues. High signal-to-noise ratio.",icon:"Bug",title:"Bug-focused rules"},{description:"Part of the larger Oxc project with parser, resolver, transformer, and minifier built for speed.",icon:"Boxes",title:"Oxc ecosystem"},{description:"Rules organized into correctness, suspicious, pedantic, performance, restriction, and style categories.",icon:"FolderTree",title:"Category-based config"},{description:"Works alongside your existing ESLint setup or as a complete replacement with Oxfmt for formatting.",icon:"RefreshCw",title:"Drop-in ready"}],configFiles:[{code:e=>`import { defineConfig } from "oxlint";
|
|
147
147
|
|
|
148
|
+
${e.map(t=>`import ${t} from "ultracite/config/oxlint/${t}/index.ts";`).join(`
|
|
149
|
+
`)}
|
|
150
|
+
|
|
148
151
|
export default defineConfig({
|
|
149
152
|
extends: [
|
|
150
|
-
${e.
|
|
153
|
+
${e.join(`,
|
|
151
154
|
`)}
|
|
152
155
|
],
|
|
153
156
|
});`,lang:"typescript",name:"oxlint.config.ts"},{code:()=>`import { defineConfig } from "oxfmt";
|
|
@@ -162,11 +165,11 @@ export default defineConfig({
|
|
|
162
165
|
arrowParens: "always",
|
|
163
166
|
proseWrap: "never",
|
|
164
167
|
printWidth: 80,
|
|
165
|
-
});`,lang:"typescript",name:"oxfmt.config.ts"}],description:"The fastest linter available. Oxlint is part of the Oxc project, running 50-100x faster than ESLint with a focus on catching bugs and reducing false positives.",id:"oxlint",includes:["Oxlint","Oxfmt"],logo:B1,name:"Oxlint + Oxfmt",subtitle:"The fastest linter available",vscodeExtensionId:"oxc.oxc-vscode"}];import{addDevDependency as Ti,detectPackageManager as
|
|
168
|
+
});`,lang:"typescript",name:"oxfmt.config.ts"}],description:"The fastest linter available. Oxlint is part of the Oxc project, running 50-100x faster than ESLint with a focus on catching bugs and reducing false positives.",id:"oxlint",includes:["Oxlint","Oxfmt"],logo:B1,name:"Oxlint + Oxfmt",subtitle:"The fastest linter available",vscodeExtensionId:"oxc.oxc-vscode"}];import{addDevDependency as Ti,detectPackageManager as Gi}from"nypm";import{readFile as vo,writeFile as ke}from"fs/promises";import{dlxCommand as yo}from"nypm";var F1=e=>e.replace(/ Code$/,"").replace(/ Agent$/,""),ko=(e,t)=>{if(e==="AGENTS.md"&&t.length>1){let i=t.slice(0,3),s=t.length>i.length?", and more":"";return`Universal (creates ${e} for ${i.join(", ")}${s})`}let[o]=t;return`${o} (creates ${e})`},N1=()=>{let e=new Map;for(let o of j){let i=e.get(o.config.path)??[];i.push(o),e.set(o.config.path,i)}return[...e.entries()].map(([o,i])=>{let[s]=i,r=i.map(c=>F1(c.name)),l=o==="AGENTS.md"&&i.length>1;return{agentIds:i.map(c=>c.id),displayName:l?"Universal":F1(s.name),id:l?"universal":s.id,path:o,promptLabel:ko(o,r),representativeAgentId:s.id}}).toSorted((o,i)=>o.path==="AGENTS.md"?-1:i.path==="AGENTS.md"?1:0)},O1=(e,t,o)=>{let i=j.find(f=>f.id===e);if(!i)throw new Error(`Agent "${e}" not found`);let s=re.find(f=>f.id===o);if(!s)throw new Error(`Provider "${o}" not found`);let r=yo(t,""),l=se(r,s.name),c=i.config.header?`${i.config.header}
|
|
166
169
|
|
|
167
|
-
${l}`:l;return{create:async()=>{await b(i.config.path),await ke(i.config.path,c)},exists:()=>m(i.config.path),update:async()=>{await b(i.config.path);let f=await m(i.config.path);if(!(i.config.appendMode&&f)){await ke(i.config.path,c);return}let
|
|
170
|
+
${l}`:l;return{create:async()=>{await b(i.config.path),await ke(i.config.path,c)},exists:()=>m(i.config.path),update:async()=>{await b(i.config.path);let f=await m(i.config.path);if(!(i.config.appendMode&&f)){await ke(i.config.path,c);return}let u=await vo(i.config.path,"utf-8");u.includes(l.trim())||await ke(i.config.path,`${u}
|
|
168
171
|
|
|
169
|
-
${l}`)}}};import{spawnSync as
|
|
172
|
+
${l}`)}}};import{spawnSync as bo}from"child_process";import{readFile as xo,writeFile as be}from"fs/promises";import Co from"deepmerge";import{parse as So}from"jsonc-parser";var L1=(e,t="biome")=>{let o=F.find(s=>s.id===e);if(!o)throw new Error(`Editor "${e}" not found`);let i=o.config.getContent(t);return{create:async()=>{await b(o.config.path),await be(o.config.path,JSON.stringify(i,null,2))},exists:()=>m(o.config.path),extension:o.config.extensionCommand?s=>bo(`${o.config.extensionCommand} ${s}`,{shell:!0,stdio:"pipe"}):void 0,update:async()=>{if(await b(o.config.path),!await m(o.config.path)){await be(o.config.path,JSON.stringify(i,null,2));return}let r=await xo(o.config.path,"utf-8"),c=So(r)||{},f=Co(c,i);await be(o.config.path,JSON.stringify(f,null,2))}}};import{readFile as Ao,writeFile as xe}from"fs/promises";import zo from"deepmerge";import{parse as Uo}from"jsonc-parser";var Io=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Eo=(e,t,o=[])=>{let i=[e];return e==="npm"&&i.push("run"),i.push(t),o.length>0&&(e==="npm"&&i.push("--"),i.push(...o)),i.join(" ")},R1=(e,t,o="biome")=>{let i=$.find(u=>u.id===e);if(!i)throw new Error(`Hook integration "${e}" not found`);let r=Eo(t,"fix",o==="biome"?["--skip=correctness/noUnusedImports"]:[]),l=i.hooks.getContent(r),c=u=>{let y=JSON.stringify(u);return y.includes("ultracite")||y.includes(r)},f=async()=>{if(!await m(i.hooks.path)){await xe(i.hooks.path,JSON.stringify(l,null,2));return}let y=await Ao(i.hooks.path,"utf-8"),B=Uo(y),D=Io(B)?B:{};if(!c(D)){let we=zo(D,l);await xe(i.hooks.path,JSON.stringify(we,null,2))}};return{create:async()=>{await b(i.hooks.path),await xe(i.hooks.path,JSON.stringify(l,null,2))},exists:()=>m(i.hooks.path),update:async()=>{await b(i.hooks.path),await f()}}};import{execSync as jo}from"child_process";import{mkdir as To,readFile as Go,writeFile as Ce}from"fs/promises";import{addDevDependency as Bo,dlxCommand as _}from"nypm";var M1=e=>`#!/bin/sh
|
|
170
173
|
${e}
|
|
171
174
|
`,$1=e=>`#!/bin/sh
|
|
172
175
|
# Exit on any error
|
|
@@ -197,14 +200,14 @@ fi
|
|
|
197
200
|
|
|
198
201
|
echo "\u2728 Files formatted by Ultracite"
|
|
199
202
|
`,V="./.husky/pre-commit",N="# ultracite",O={create:async(e,t=!1)=>{await To(".husky",{recursive:!0});let o;if(t){let i=_(e,"lint-staged",{short:e==="npm"});o=M1(i)}else{let i=_(e,"ultracite",{args:["fix"],short:e==="npm"});o=$1(i)}await Ce(V,`${N}
|
|
200
|
-
${o}`)},exists:()=>m(V),init:e=>{let t=_(e,"husky",{args:["init"]});try{
|
|
203
|
+
${o}`)},exists:()=>m(V),init:e=>{let t=_(e,"husky",{args:["init"]});try{jo(t,{stdio:"pipe"})}catch{}},install:async e=>{await Bo("husky",{corepack:!1,packageManager:e,silent:!0,workspace:await S()}),await k({scripts:{prepare:"husky"}})},update:async(e,t=!1)=>{let o=await Go(V,"utf-8"),i;if(t){let s=_(e,"lint-staged",{short:e==="npm"});i=M1(s)}else{let s=_(e,"ultracite",{args:["fix"],short:e==="npm"});i=$1(s)}if(o.includes(N)){let s=o.split(`
|
|
201
204
|
`),r=s.indexOf(N),l=s.slice(0,r).join(`
|
|
202
205
|
`);await Ce(V,l?`${l}
|
|
203
206
|
${N}
|
|
204
207
|
${i}`:`${N}
|
|
205
208
|
${i}`)}else await Ce(V,`${o}
|
|
206
209
|
${N}
|
|
207
|
-
${i}`)}};import{execSync as
|
|
210
|
+
${i}`)}};import{execSync as Do}from"child_process";import{readFile as Po,writeFile as W}from"fs/promises";import{addDevDependency as Fo,dlxCommand as V1}from"nypm";var No=/(pre-commit:\s*\n\s*jobs:\s*\n)/,Oo=/(pre-commit:\s*\n)/,W1=e=>V1(e,"ultracite",{args:["fix"],short:e==="npm"}),T="./lefthook.yml",_1=e=>`pre-commit:
|
|
208
211
|
jobs:
|
|
209
212
|
- run: ${W1(e)}
|
|
210
213
|
glob:
|
|
@@ -216,7 +219,7 @@ ${i}`)}};import{execSync as Bo}from"child_process";import{readFile as Do,writeFi
|
|
|
216
219
|
- "**/*.jsonc"
|
|
217
220
|
- "**/*.css"
|
|
218
221
|
stage_fixed: true
|
|
219
|
-
`,J={create:async e=>{let t=_1(e);await W(
|
|
222
|
+
`,J={create:async e=>{let t=_1(e);await W(T,t)},exists:()=>m(T),install:async e=>{await Fo("lefthook",{corepack:!1,packageManager:e,silent:!0,workspace:await S()}),await k({scripts:{prepare:"lefthook install"}});let t=V1(e.name,"lefthook",{args:["install"],short:e.name==="npm"});Do(t,{stdio:"pipe"})},update:async e=>{let t=await Po(T,"utf-8"),o=W1(e),i=_1(e);if(t.includes(o))return;if(t.startsWith("# EXAMPLE USAGE:")){await W(T,i);return}if(t.includes("pre-commit:"))if(t.includes("jobs:")){let r=` - run: ${o}
|
|
220
223
|
glob:
|
|
221
224
|
- "**/*.js"
|
|
222
225
|
- "**/*.jsx"
|
|
@@ -225,8 +228,8 @@ ${i}`)}};import{execSync as Bo}from"child_process";import{readFile as Do,writeFi
|
|
|
225
228
|
- "**/*.json"
|
|
226
229
|
- "**/*.jsonc"
|
|
227
230
|
- "**/*.css"
|
|
228
|
-
stage_fixed: true`,l=t.replace(
|
|
229
|
-
`);await W(
|
|
231
|
+
stage_fixed: true`,l=t.replace(No,`$1${r}
|
|
232
|
+
`);await W(T,l)}else{let r=` jobs:
|
|
230
233
|
- run: ${o}
|
|
231
234
|
glob:
|
|
232
235
|
- "**/*.js"
|
|
@@ -236,15 +239,15 @@ ${i}`)}};import{execSync as Bo}from"child_process";import{readFile as Do,writeFi
|
|
|
236
239
|
- "**/*.json"
|
|
237
240
|
- "**/*.jsonc"
|
|
238
241
|
- "**/*.css"
|
|
239
|
-
stage_fixed: true`,l=t.replace(
|
|
240
|
-
`);await W(
|
|
241
|
-
${i}`)}};import{readFile as le,writeFile as G}from"fs/promises";import{pathToFileURL as q1}from"url";import q from"deepmerge";import{parse as Ae}from"jsonc-parser";import{addDevDependency as
|
|
242
|
-
`).filter(r=>r.trim()&&!r.trim().startsWith("#")),o={},i=null,s=[];for(let r of t){let l=
|
|
242
|
+
stage_fixed: true`,l=t.replace(Oo,`$1${r}
|
|
243
|
+
`);await W(T,l)}else await W(T,`${t}
|
|
244
|
+
${i}`)}};import{readFile as le,writeFile as G}from"fs/promises";import{pathToFileURL as q1}from"url";import q from"deepmerge";import{parse as Ae}from"jsonc-parser";import{addDevDependency as Lo,dlxCommand as Ro}from"nypm";var z=e=>({"*.{js,jsx,ts,tsx,json,jsonc,css,scss,md,mdx}":[Ro(e,"ultracite",{args:["fix"],short:e==="npm"})]}),J1=["./package.json","./.lintstagedrc.json","./.lintstagedrc.js","./.lintstagedrc.cjs","./.lintstagedrc.mjs","./lint-staged.config.js","./lint-staged.config.cjs","./lint-staged.config.mjs","./.lintstagedrc.yaml","./.lintstagedrc.yml","./.lintstagedrc"],Mo=(e,t,o,i)=>{let s=e.trim();if(s.includes(":")&&!s.startsWith("-")){o&&i.length>0&&(t[o]=i);let[r,...l]=s.split(":"),c=l.join(":").trim(),f=r.trim().replaceAll(/['"]/g,"");return c&&c!==""?(t[f]=c.startsWith("[")&&c.endsWith("]")?c.slice(1,-1).split(",").map(u=>u.trim().replaceAll(/['"]/g,"")):c.replaceAll(/['"]/g,""),{newCurrentArray:[],newCurrentKey:null}):{newCurrentArray:[],newCurrentKey:f}}return s.startsWith("-")&&o?{newCurrentArray:[...i,s.slice(1).trim().replaceAll(/['"]/g,"")],newCurrentKey:o}:{newCurrentArray:i,newCurrentKey:o}},$o=e=>{let t=e.split(`
|
|
245
|
+
`).filter(r=>r.trim()&&!r.trim().startsWith("#")),o={},i=null,s=[];for(let r of t){let l=Mo(r,o,i,s);i=l.newCurrentKey,s=l.newCurrentArray}return i&&s.length>0&&(o[i]=s),o},_o=e=>{let t="";for(let[o,i]of Object.entries(e))if(Array.isArray(i)){t+=`${o}:
|
|
243
246
|
`;for(let s of i)t+=` - '${s}'
|
|
244
247
|
`}else t+=`${o}: '${i}'
|
|
245
|
-
`;return t},
|
|
246
|
-
`;await G(e,l)},
|
|
247
|
-
`;await G(e,l)},Se=async e=>{await G(".lintstagedrc.json",JSON.stringify(z(e),null,2))},
|
|
248
|
+
`;return t},Vo=async()=>{try{let e=Ae(await le("./package.json","utf-8"));return e?e.type==="module":!1}catch{return!1}},Wo=async e=>{let t=Ae(await le("./package.json","utf-8"));t&&(t["lint-staged"]=t["lint-staged"]?q(t["lint-staged"],z(e)):z(e),await G("./package.json",JSON.stringify(t,null,2)))},Jo=async(e,t)=>{let o=await le(e,"utf-8"),i=Ae(o);if(!i)return;let s=q(i,z(t));await G(e,JSON.stringify(s,null,2))},qo=async(e,t)=>{let o=await le(e,"utf-8"),i=$o(o);if(!i)return;let s=q(i,z(t));await G(e,_o(s))},Ho=async(e,t)=>{let s=(await import(q1(e).href)).default||{},r=q(s,z(t)),l=`export default ${JSON.stringify(r,null,2)};
|
|
249
|
+
`;await G(e,l)},Ko=async(e,t)=>{let i=await import(`${q1(e).href}?t=${Date.now()}`),s=i.default||i,r=q(s,z(t)),l=`module.exports = ${JSON.stringify(r,null,2)};
|
|
250
|
+
`;await G(e,l)},Se=async e=>{await G(".lintstagedrc.json",JSON.stringify(z(e),null,2))},Qo=async(e,t)=>{if(e==="./package.json"){await Wo(t);return}if(e.endsWith(".json")||e==="./.lintstagedrc"){await Jo(e,t);return}if(e.endsWith(".yaml")||e.endsWith(".yml")){await qo(e,t);return}let o=await Vo();if(e.endsWith(".mjs")||e.endsWith(".js")&&o){try{await Ho(e,t)}catch{await Se(t)}return}if(e.endsWith(".cjs")||e.endsWith(".js")&&!o)try{await Ko(e,t)}catch{await Se(t)}},H={create:async e=>{await G(".lintstagedrc.json",JSON.stringify(z(e),null,2))},exists:async()=>{for(let e of J1)if(await m(e))return!0;return!1},install:async e=>{await Lo("lint-staged",{corepack:!1,packageManager:e,silent:!0,workspace:await S()})},update:async e=>{let t=null;for(let o of J1)if(await m(o)){t=o;break}if(!t){await Se(e);return}await Qo(t,e)}};import{readFile as Zo,writeFile as ze}from"fs/promises";import{dlxCommand as Yo}from"nypm";var K="./.pre-commit-config.yaml",Xo=/^repos:\s*\n/m,H1=e=>Yo(e,"ultracite",{args:["fix"],short:e==="npm"}),ei=e=>`repos:
|
|
248
251
|
- repo: local
|
|
249
252
|
hooks:
|
|
250
253
|
- id: ultracite
|
|
@@ -253,7 +256,7 @@ ${i}`)}};import{readFile as le,writeFile as G}from"fs/promises";import{pathToFil
|
|
|
253
256
|
language: system
|
|
254
257
|
types_or: [javascript, jsx, ts, tsx, json, css]
|
|
255
258
|
pass_filenames: false
|
|
256
|
-
`,ce={create:async e=>{let t=
|
|
259
|
+
`,ce={create:async e=>{let t=ei(e);await ze(K,t)},exists:()=>m(K),update:async e=>{let t=await Zo(K,"utf-8"),o=H1(e);if(t.includes("id: ultracite"))return;let i=` - repo: local
|
|
257
260
|
hooks:
|
|
258
261
|
- id: ultracite
|
|
259
262
|
name: ultracite
|
|
@@ -261,27 +264,30 @@ ${i}`)}};import{readFile as le,writeFile as G}from"fs/promises";import{pathToFil
|
|
|
261
264
|
language: system
|
|
262
265
|
types_or: [javascript, jsx, ts, tsx, json, css]
|
|
263
266
|
pass_filenames: false
|
|
264
|
-
`;if(t.includes("repos:")){let s=t.replace(
|
|
267
|
+
`;if(t.includes("repos:")){let s=t.replace(Xo,`repos:
|
|
265
268
|
${i}`);await ze(K,s)}else await ze(K,`${t}
|
|
266
269
|
repos:
|
|
267
|
-
${i}`)}};import{readFile as
|
|
270
|
+
${i}`)}};import{readFile as ti,writeFile as K1}from"fs/promises";import oi from"deepmerge";import{parse as ii}from"jsonc-parser";var Q1={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite/biome/core"]},Ue=async()=>await m("./biome.json")?"./biome.json":"./biome.jsonc",de={create:async e=>{let t=await Ue(),o=["ultracite/biome/core"];if(e?.typeAware&&o.push("ultracite/biome/type-aware"),e?.frameworks&&e.frameworks.length>0)for(let s of e.frameworks)o.push(`ultracite/biome/${s}`);let i={...Q1,extends:o};return K1(t,JSON.stringify(i,null,2))},exists:async()=>{let e=await Ue();return m(e)},update:async e=>{let t=await Ue(),o=await ti(t,"utf-8"),s=ii(o)||{},l=[...s.extends&&Array.isArray(s.extends)?s.extends:[]];if(l.includes("ultracite/biome/core")||l.push("ultracite/biome/core"),e?.typeAware&&!l.includes("ultracite/biome/type-aware")&&l.push("ultracite/biome/type-aware"),e?.frameworks&&e.frameworks.length>0)for(let u of e.frameworks){let y=`ultracite/biome/${u}`;l.includes(y)||l.push(y)}s.extends=l;let c={$schema:Q1.$schema},f=oi(s,c);await K1(t,JSON.stringify(f,null,2))}};import{writeFile as Z1}from"fs/promises";var si=["./eslint.config.mjs","./eslint.config.js","./eslint.config.cjs","./eslint.config.ts","./eslint.config.mts","./eslint.config.cts"],Y1="./eslint.config.mjs",ni=async()=>{for(let e of si)if(await m(e))return e;return null},X1=e=>{let t=['import core from "ultracite/eslint/core";'],o=["...core"];if(e?.frameworks&&e.frameworks.length>0)for(let i of e.frameworks)t.push(`import ${i} from "ultracite/eslint/${i}";`),o.push(`...${i}`);return`${t.join(`
|
|
268
271
|
`)}
|
|
269
272
|
|
|
270
273
|
export default [
|
|
271
274
|
${o.join(`,
|
|
272
275
|
`)},
|
|
273
276
|
];
|
|
274
|
-
`},pe={create:async e=>{let t=X1(e);await Z1(Y1,t)},exists:async()=>await
|
|
277
|
+
`},pe={create:async e=>{let t=X1(e);await Z1(Y1,t)},exists:async()=>await ni()!==null,update:async e=>{let t=X1(e);await Z1(Y1,t)}};import{writeFile as et}from"fs/promises";var Ie="./oxfmt.config.ts",tt=`import config from "ultracite/oxfmt";
|
|
275
278
|
|
|
276
279
|
export default config;
|
|
277
|
-
`,me={create:async()=>await et(Ie,tt),exists:async()=>await m(Ie),update:async()=>await et(Ie,tt)};import{readFile as
|
|
280
|
+
`,me={create:async()=>await et(Ie,tt),exists:async()=>await m(Ie),update:async()=>await et(Ie,tt)};import{readFile as ai,writeFile as ot}from"fs/promises";var fe="./oxlint.config.ts",Q=e=>`ultracite/config/oxlint/${e}`,it=e=>{let t=e.split("/").pop();return t==="core"?"core":t},st=e=>{let t=e.map(i=>`import ${it(i)} from "${i}/index.ts";`).join(`
|
|
281
|
+
`),o=e.map(i=>` ${it(i)},`).join(`
|
|
282
|
+
`);return`import { defineConfig } from "oxlint";
|
|
283
|
+
|
|
284
|
+
${t}
|
|
278
285
|
|
|
279
286
|
export default defineConfig({
|
|
280
287
|
extends: [
|
|
281
|
-
${
|
|
282
|
-
`)}
|
|
288
|
+
${o}
|
|
283
289
|
],
|
|
284
290
|
});
|
|
285
|
-
|
|
286
|
-
`,ue={create:async()=>{let e=
|
|
287
|
-
`,he={create:async()=>{let e=ct();await rt(lt,e)},exists:async()=>await fi()!==null,update:async()=>{let e=ct();await rt(lt,e)}};import{isCancel as gi,select as ui,spinner as hi}from"@clack/prompts";import{dlxCommand as wi}from"nypm";var vi="haydenbleasel/ultracite",dt=e=>wi(e,"skills",{args:["add",vi],short:e==="npm"}),yi=async()=>{let e=await ui({message:"Do you want to install the Ultracite skill?",options:[{label:"Yes, install it",value:"install"},{label:"No, I'll do it later",value:"skip"}]});return!gi(e)&&e==="install"},pt=e=>dt(e),mt=async({packageManager:e,quiet:t=!1,shouldInstall:o})=>{if(!(o??(!t&&await yi())))return!1;let s=dt(e),r=hi();t||r.start("Installing the Ultracite skill...");let l=Ge(s,{stdio:"pipe"}),c=!l.error&&l.status===0;return t||r.stop(c?"Ultracite skill installed.":"Couldn't install the Ultracite skill automatically."),c};import{readFile as ki,writeFile as ft}from"fs/promises";import{glob as bi}from"glob";import{applyEdits as xi,modify as Ci,parse as Si}from"jsonc-parser";var gt=async()=>{try{return await bi("**/tsconfig*.json",{absolute:!1,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**"]})}catch{return[]}},Ai=e=>{if(!e)return!1;let t=e.compilerOptions;return t?t.strict===!0||t.strictNullChecks===!0:!1},zi=async e=>{try{let t=await ki(e,"utf-8"),o=Si(t);if(Ai(o))return;if(o===void 0){await ft(e,JSON.stringify({compilerOptions:{strictNullChecks:!0}},null,2));return}let s=Ci(t,["compilerOptions","strictNullChecks"],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}),r=xi(t,s);await ft(e,r)}catch(t){console.warn(`Failed to update ${e}:`,t)}},Ee={exists:async()=>(await gt()).length>0,update:async()=>{let e=await gt();if(e.length===0){console.warn("No tsconfig.json files found in the project");return}await Promise.all(e.map(t=>zi(t)))}};var ht=d.devDependencies["@biomejs/biome"],Te=d.version,ut="^9.0.0",Gi={"@eslint/js":ut,"@typescript-eslint/eslint-plugin":d.devDependencies["@typescript-eslint/eslint-plugin"],"@typescript-eslint/parser":d.devDependencies["@typescript-eslint/parser"],eslint:ut,"eslint-config-prettier":d.devDependencies["eslint-config-prettier"],"eslint-import-resolver-typescript":d.devDependencies["eslint-import-resolver-typescript"],"eslint-plugin-compat":d.devDependencies["eslint-plugin-compat"],"eslint-plugin-cypress":d.devDependencies["eslint-plugin-cypress"],"eslint-plugin-github":d.devDependencies["eslint-plugin-github"],"eslint-plugin-html":d.devDependencies["eslint-plugin-html"],"eslint-plugin-import-x":d.devDependencies["eslint-plugin-import-x"],"eslint-plugin-n":d.devDependencies["eslint-plugin-n"],"eslint-plugin-prettier":d.devDependencies["eslint-plugin-prettier"],"eslint-plugin-promise":d.devDependencies["eslint-plugin-promise"],"eslint-plugin-sonarjs":d.devDependencies["eslint-plugin-sonarjs"],"eslint-plugin-storybook":d.devDependencies["eslint-plugin-storybook"],"eslint-plugin-unicorn":d.devDependencies["eslint-plugin-unicorn"],"eslint-plugin-unused-imports":d.devDependencies["eslint-plugin-unused-imports"],globals:d.devDependencies.globals,prettier:"latest","prettier-plugin-svelte":d.devDependencies["prettier-plugin-svelte"],"prettier-plugin-tailwindcss":d.devDependencies["prettier-plugin-tailwindcss"],stylelint:"latest"},Bi={angular:{"@angular-eslint/eslint-plugin":"latest"},astro:{"eslint-plugin-astro":d.devDependencies["eslint-plugin-astro"]},jest:{"eslint-plugin-jest":d.devDependencies["eslint-plugin-jest"]},next:{"@next/eslint-plugin-next":d.devDependencies["@next/eslint-plugin-next"]},qwik:{"eslint-plugin-qwik":d.devDependencies["eslint-plugin-qwik"]},react:{"@tanstack/eslint-plugin-query":d.devDependencies["@tanstack/eslint-plugin-query"],"eslint-plugin-jsx-a11y":d.devDependencies["eslint-plugin-jsx-a11y"],"eslint-plugin-react":d.devDependencies["eslint-plugin-react"],"eslint-plugin-react-hooks":d.devDependencies["eslint-plugin-react-hooks"]},remix:{"eslint-plugin-remix":d.devDependencies["eslint-plugin-remix"]},solid:{"eslint-plugin-solid":d.devDependencies["eslint-plugin-solid"]},svelte:{"eslint-plugin-svelte":d.devDependencies["eslint-plugin-svelte"]},vitest:{"@vitest/eslint-plugin":d.devDependencies["@vitest/eslint-plugin"]},vue:{"eslint-plugin-vue":d.devDependencies["eslint-plugin-vue"]}},wt=e=>{let t={...Gi};for(let o of e)Object.assign(t,Bi[o]);return t},Di=(e,t,o)=>{let i={ultracite:Te};return e==="biome"&&(i["@biomejs/biome"]=ht),e==="eslint"&&Object.assign(i,wt(o)),e==="oxlint"&&(i.oxlint="latest",i.oxfmt="latest",t&&(i["oxlint-tsgolint"]="latest")),i},Pi=async(e,t="biome",o=!0,i=!1,s=!1,r=["react"])=>{let l=w();i||l.start("Installing dependencies...");let c=[`ultracite@${Te}`];if(t==="biome"&&c.push(`@biomejs/biome@${ht}`),t==="eslint"&&c.push(...Object.entries(wt(r)).map(([f,h])=>`${f}@${h}`)),t==="oxlint"&&(c.push("oxlint@latest"),c.push("oxfmt@latest"),s&&c.push("oxlint-tsgolint@latest")),o)for(let f of c)await Ti(f,{corepack:!1,packageManager:e,silent:!0,workspace:await S()});else{let f=Di(t,s,r);await k({devDependencies:f})}await k({scripts:{check:"ultracite check",fix:"ultracite fix"}}),i||l.stop("Dependencies installed.")},Fi=async(e=!1)=>{let t=w();if(e||t.start("Checking for tsconfig.json files..."),await Ee.exists()){e||t.message("Found tsconfig.json files, updating with strictNullChecks..."),await Ee.update(),e||t.stop("tsconfig.json files updated.");return}e||t.stop("No tsconfig.json files found, skipping.")},Ni=async(e,t="biome",o=!1)=>{let i=F.find(l=>l.id===e);if(!i)throw new Error(`Editor "${e}" not found`);let s=L1(e,t),r=w();if(o||r.start(`Checking for ${i.config.path}...`),await s.exists()){o||r.message(`${i.config.path} found, updating...`),await s.update(),o||r.stop(`${i.config.path} updated.`);return}if(o||r.message(`${i.config.path} not found, creating...`),await s.create(),s.extension){let l=re.find(c=>c.id===t)?.vscodeExtensionId;if(!l)throw new Error(`Linter extension not found for ${t}`);o||r.message(`Installing ${l} extension...`);try{if(s.extension(l).status===0){o||r.stop(`${i.config.path} created and ${l} extension installed.`);return}}catch{}o||r.stop(`${i.config.path} created. Install ${l} extension manually.`);return}o||(e==="zed"?r.stop(`${i.config.path} created. Install the Biome extension: https://biomejs.dev/reference/zed/`):r.stop(`${i.config.path} created.`))},Oi=async(e,t=!1,o=!1)=>{let i=w();if(t||i.start("Checking for Biome configuration..."),await de.exists()){t||i.message("Biome configuration found, updating..."),await de.update({frameworks:e,typeAware:o}),t||i.stop("Biome configuration updated.");return}t||i.message("Biome configuration not found, creating..."),await de.create({frameworks:e,typeAware:o}),t||i.stop("Biome configuration created.")},Li=async(e,t=!1)=>{let o=w();if(t||o.start("Checking for ESLint configuration..."),await pe.exists()){t||o.message("ESLint configuration found, updating..."),await pe.update({frameworks:e}),t||o.stop("ESLint configuration updated.");return}t||o.message("ESLint configuration not found, creating..."),await pe.create({frameworks:e}),t||o.stop("ESLint configuration created.")},Ri=async(e,t=!1)=>{let o=w();if(t||o.start("Checking for Oxlint configuration..."),await ge.exists()){t||o.message("Oxlint configuration found, updating..."),await ge.update({frameworks:e}),t||o.stop("Oxlint configuration updated.");return}t||o.message("Oxlint configuration not found, creating..."),await ge.create({frameworks:e}),t||o.stop("Oxlint configuration created.")},Mi=async(e=!1)=>{let t=w();if(e||t.start("Checking for Prettier configuration..."),await ue.exists()){e||t.message("Prettier configuration found, updating..."),await ue.update(),e||t.stop("Prettier configuration updated.");return}e||t.message("Prettier configuration not found, creating..."),await ue.create(),e||t.stop("Prettier configuration created.")},$i=async(e=!1)=>{let t=w();if(e||t.start("Checking for Stylelint configuration..."),await he.exists()){e||t.message("Stylelint configuration found, updating..."),await he.update(),e||t.stop("Stylelint configuration updated.");return}e||t.message("Stylelint configuration not found, creating..."),await he.create(),e||t.stop("Stylelint configuration created.")},_i=async(e=!1)=>{let t=w();if(e||t.start("Checking for oxfmt configuration..."),await me.exists()){e||t.message("oxfmt configuration found, updating..."),await me.update(),e||t.stop("oxfmt configuration updated.");return}e||t.message("oxfmt configuration not found, creating..."),await me.create(),e||t.stop("oxfmt configuration created.")},Vi=async(e,t=!0,o=!1,i=!1)=>{let s=w();if(o||(s.start("Initializing pre-commit hooks..."),s.message("Installing Husky...")),await(t?O.install(e):k({devDependencies:{husky:"latest"},scripts:{prepare:"husky"}})),o||s.message("Initializing Husky..."),O.init(e.name),await O.exists()){o||s.message("Pre-commit hook found, updating..."),await O.update(e.name,i),o||s.stop("Pre-commit hook updated.");return}o||s.message("Pre-commit hook not found, creating..."),await O.create(e.name,i),o||s.stop("Pre-commit hook created.")},Wi=async(e,t=!0,o=!1)=>{let i=w();if(o||(i.start("Initializing lefthook..."),i.message("Installing lefthook...")),await(t?J.install(e):k({devDependencies:{lefthook:"latest"}})),await J.exists()){o||i.message("lefthook.yml found, updating..."),await J.update(e.name),o||i.stop("lefthook.yml updated.");return}o||i.message("lefthook.yml not found, creating..."),await J.create(e.name),o||i.stop("lefthook.yml created.")},Ji=async(e,t=!0,o=!1)=>{let i=w();if(o||(i.start("Initializing lint-staged..."),i.message("Installing lint-staged...")),await(t?H.install(e):k({devDependencies:{"lint-staged":"latest"}})),await H.exists()){o||i.message("lint-staged found, updating..."),await H.update(e.name),o||i.stop("lint-staged updated.");return}o||i.message("lint-staged not found, creating..."),await H.create(e.name),o||i.stop("lint-staged created.")},qi=async(e,t=!1)=>{let o=w();if(t||o.start("Initializing pre-commit..."),await ce.exists()){t||o.message(".pre-commit-config.yaml found, updating..."),await ce.update(e),t||o.stop(".pre-commit-config.yaml updated.");return}t||o.message(".pre-commit-config.yaml not found, creating..."),await ce.create(e),t||o.stop(".pre-commit-config.yaml created.")},vt=async(e,t,o,i,s=!1)=>{let r=w();s||r.start(`Checking for ${t}...`);let l=O1(e,o,i);if(await l.exists()){s||r.message(`${t} found, updating...`),await l.update(),s||r.stop(`${t} updated.`);return}s||r.message(`${t} not found, creating...`),await l.create(),s||r.stop(`${t} created.`)},Hi=async(e,t,o,i=!1)=>{let s=`${e.displayName} (${e.path})`;await vt(e.representativeAgentId,s,t,o,i)},Ki=async(e,t,o="biome",i=!1)=>{let s=w(),r=$.find(c=>c.id===e)?.name??e;i||s.start(`Checking for ${r} hooks...`);let l=R1(e,t,o);if(await l.exists()){i||s.message(`${r} hooks found, updating...`),await l.update(),i||s.stop(`${r} hooks updated.`);return}i||s.message(`${r} hooks not found, creating...`),await l.create(),i||s.stop(`${r} hooks created.`)},yt=async e=>{let t=e??{},o=t.quiet??!1;o||Ii(`Ultracite v${Te} Initialization`);try{let{pm:i}=t,s;if(i)s={command:i,name:i};else{let p=await ji(Ui.cwd());if(!p)throw new Error("No package manager specified or detected");if(!o&&p.warnings)for(let g of p.warnings)Z.warn(g);o||Z.info(`Detected lockfile, using ${p.name}`),i=p.name,s=p}let{linter:r}=t;if(r===void 0)if(o||t.pm||t.editors||t.agents||t.hooks||t.integrations!==void 0||t.frameworks!==void 0)r="biome";else{let g=await Ei({message:"Which linter do you want to use?",options:[{label:"Biome (Recommended)",value:"biome"},{label:"ESLint + Prettier + Stylelint",value:"eslint"},{label:"Oxlint + Oxfmt",value:"oxlint"}]});if(R(g)){L("Operation cancelled.");return}r=g}let{frameworks:l}=t;if(l===void 0)if(o||t.pm||t.editors||t.agents||t.hooks||t.integrations!==void 0)l=[];else{let g=await Y({message:"Which frameworks are you using (optional)?",options:[{label:"React",value:"react"},{label:"Next.js",value:"next"},{label:"Solid",value:"solid"},{label:"Vue",value:"vue"},{label:"Svelte",value:"svelte"},{label:"Qwik",value:"qwik"},{label:"Angular",value:"angular"},{label:"Remix / TanStack Router / React Router",value:"remix"},{label:"Astro",value:"astro"},{label:"NestJS",value:"nestjs"},{label:"Jest",value:"jest"},{label:"Vitest / Bun",value:"vitest"}],required:!1});if(R(g)){L("Operation cancelled.");return}l=g}let c=t.editors;if(!c)if(o)c=[];else{let p=await Y({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1});if(R(p)){L("Operation cancelled.");return}c=p}let{agents:f}=t,h=[],{hooks:y}=t,B=N1(),D=B.find(p=>p.id==="universal"),we=Object.fromEntries(T.map(p=>[p.id,p.name]));if(f){if(f.includes("universal")&&D){h=[D];let p=new Set(D.agentIds);f=f.filter(g=>g!=="universal"&&!p.has(g))}}else if(o)f=[];else{let p=await Y({message:"Which agent files do you want to add (optional)?",options:B.map(g=>({label:g.promptLabel,value:g.id})),required:!1});if(R(p)){L("Operation cancelled.");return}h=B.filter(g=>p.includes(g.id))}let kt=Object.fromEntries($.map(p=>[p.id,p.name]));if(!y)if(o)y=[];else{let p=await Y({message:"Which agent hooks do you want to enable (optional)?",options:Object.entries(kt).map(([g,xt])=>({label:xt,value:g})),required:!1});if(R(p)){L("Operation cancelled.");return}y=p}let{integrations:C}=t;if(C===void 0)if(o||t.pm||t.editors||t.agents||t.hooks)C=[];else{let g=await Y({message:"Would you like any of the following (optional)?",options:[{label:"Husky pre-commit hook",value:"husky"},{label:"Lefthook pre-commit hook",value:"lefthook"},{label:"Lint-staged",value:"lint-staged"},{label:"pre-commit (Python framework)",value:"pre-commit"}],required:!1});if(R(g)){L("Operation cancelled.");return}C=g}await Pi(s,r,!t.skipInstall,o,t["type-aware"],l),await Fi(o),r==="biome"&&await Oi(l,o,t["type-aware"]),r==="eslint"&&(await Li(l,o),await Mi(o),await $i(o)),r==="oxlint"&&(await Ri(l,o),await _i(o));for(let p of c??[])await Ni(p,r,o);for(let p of h)await Hi(p,i,r,o);for(let p of f??[])await vt(p,we[p],i,r,o);for(let p of y??[])await Ki(p,i,r,o);if(C?.includes("husky")){let p=C?.includes("lint-staged")??!1;await Vi(s,!t.skipInstall,o,p)}C?.includes("lefthook")&&await Wi(s,!t.skipInstall,o),C?.includes("lint-staged")&&await Ji(s,!t.skipInstall,o),C?.includes("pre-commit")&&await qi(i,o),o||Z.success("Successfully initialized Ultracite!");let bt=await mt({packageManager:i,quiet:o,shouldInstall:t.installSkill});!o&&!bt&&Z.info(`You can install the Ultracite skill later with \`${pt(i)}\`.`)}catch(i){let s=i instanceof Error?i.message:"Unknown error";throw o||Z.error(`Failed to initialize Ultracite configuration: ${s}`),i}};var M=new Qi;M.name("ultracite").version(d.version).description(d.description);M.command("init").description("Initialize Ultracite in the current directory").option("--pm <pm>","Package manager to use").option("--linter <linter>","Linter to use").option("--editors <editors...>","Editors to configure").option("--agents <agents...>","Agents to enable (use universal for AGENTS.md)").option("--hooks <hooks...>","Hooks to enable").option("--frameworks <frameworks...>","Frameworks being used").option("--integrations <integrations...>","Integrations to enable").option("--install-skill","Install the reusable Ultracite skill after setup").option("--type-aware","Enable type-aware linting (enables project/scanner rules)").option("--skip-install","Skip installing dependencies").option("--quiet","Suppress interactive prompts").action(async e=>{await yt({agents:e.agents,editors:e.editors,frameworks:e.frameworks,hooks:e.hooks,installSkill:e.installSkill,integrations:e.integrations,linter:e.linter,pm:e.pm,quiet:e.quiet??(process.env.CI==="true"||process.env.CI==="1"),skipInstall:e.skipInstall,"type-aware":e.typeAware})});M.command("check").argument("[files...]","Files to check").description("Run linter without fixing files. Unknown options are passed to the underlying linter.").allowUnknownOption().action(async e=>{let t=process.argv.indexOf("check"),i=process.argv.slice(t+1).filter(r=>r.startsWith("-")),s=e.filter(r=>!r.startsWith("--"));await Pe(s,i)});M.command("fix").argument("[files...]","Files to fix").description("Run linter and fix files. Unknown options are passed to the underlying linter.").allowUnknownOption().action(async e=>{let t=process.argv.indexOf("fix"),i=process.argv.slice(t+1).filter(r=>r.startsWith("-")),s=e.filter(r=>!r.startsWith("--"));await Ne(s,i)});M.command("doctor").description("Verify your Ultracite setup").action(async()=>{await Fe()});process.env.TEST||M.parse();export{M as program};
|
|
291
|
+
`},ge={create:async e=>{let t=[Q("core")];if(e?.frameworks&&e.frameworks.length>0)for(let o of e.frameworks)t.push(Q(o));return await ot(fe,st(t))},exists:async()=>await m(fe),update:async e=>{let t=await ai(fe,"utf-8"),o=[],i=t.matchAll(/import \w+ from ["']([^"']+)["']/g);for(let l of i)l[1].startsWith("ultracite/config/oxlint/")&&o.push(l[1].replace(/\/index\.ts$/,""));if(o.length===0){let l=t.match(/extends:\s*\[([\s\S]*?)\]/);if(l?.[1]){let c=l[1].matchAll(/"([^"]+)"/g);for(let f of c){let u=f[1].replace(/^\.\/node_modules\/ultracite\/config\/oxlint\//,"ultracite/config/oxlint/");o.push(u)}}}let s=l=>o.some(c=>c===Q(l)),r=[...o];if(s("core")||r.push(Q("core")),e?.frameworks&&e.frameworks.length>0)for(let l of e.frameworks)s(l)||r.push(Q(l));await ot(fe,st(r))}};import{readFile as ri,writeFile as nt}from"fs/promises";var li=["./.prettierrc.mjs","./prettier.config.mjs","./.prettierrc.mts","./prettier.config.mts","./.prettierrc.cjs","./prettier.config.cjs","./.prettierrc.cts","./prettier.config.cts","./.prettierrc.js","./prettier.config.js","./.prettierrc.ts","./prettier.config.ts","./.prettierrc","./.prettierrc.json","./.prettierrc.json5","./.prettierrc.yml","./.prettierrc.yaml","./.prettierrc.toml"],at="./prettier.config.mjs",ci=async()=>{try{return"prettier"in JSON.parse(await ri("./package.json","utf-8"))}catch{return!1}},di=async()=>{if(await ci())return"./package.json";for(let e of li)if(await m(e))return e;return null},rt=()=>`export { default } from "ultracite/prettier";
|
|
292
|
+
`,ue={create:async()=>{let e=rt();await nt(at,e)},exists:async()=>await di()!==null,update:async()=>{let e=rt();await nt(at,e)}};import{readFile as pi,writeFile as lt}from"fs/promises";var mi=["./.stylelintrc.mjs","./stylelint.config.mjs","./.stylelintrc.cjs","./stylelint.config.cjs","./.stylelintrc.js","./stylelint.config.js","./.stylelintrc","./.stylelintrc.json","./.stylelintrc.yml","./.stylelintrc.yaml"],ct="./stylelint.config.mjs",fi=async()=>{try{return"stylelint"in JSON.parse(await pi("./package.json","utf-8"))}catch{return!1}},gi=async()=>{if(await fi())return"./package.json";for(let e of mi)if(await m(e))return e;return null},dt=()=>`export { default } from "ultracite/stylelint";
|
|
293
|
+
`,he={create:async()=>{let e=dt();await lt(ct,e)},exists:async()=>await gi()!==null,update:async()=>{let e=dt();await lt(ct,e)}};import{isCancel as ui,select as hi,spinner as wi}from"@clack/prompts";import{dlxCommand as vi}from"nypm";var yi="haydenbleasel/ultracite",pt=e=>vi(e,"skills",{args:["add",yi],short:e==="npm"}),ki=async()=>{let e=await hi({message:"Do you want to install the Ultracite skill?",options:[{label:"Yes, install it",value:"install"},{label:"No, I'll do it later",value:"skip"}]});return!ui(e)&&e==="install"},mt=e=>pt(e),ft=async({packageManager:e,quiet:t=!1,shouldInstall:o})=>{if(!(o??(!t&&await ki())))return!1;let s=pt(e),r=wi();t||r.start("Installing the Ultracite skill...");let l=Ge(s,{stdio:"pipe"}),c=!l.error&&l.status===0;return t||r.stop(c?"Ultracite skill installed.":"Couldn't install the Ultracite skill automatically."),c};import{readFile as bi,writeFile as gt}from"fs/promises";import{glob as xi}from"glob";import{applyEdits as Ci,modify as Si,parse as Ai}from"jsonc-parser";var ut=async()=>{try{return await xi("**/tsconfig*.json",{absolute:!1,ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**"]})}catch{return[]}},zi=e=>{if(!e)return!1;let t=e.compilerOptions;return t?t.strict===!0||t.strictNullChecks===!0:!1},Ui=async e=>{try{let t=await bi(e,"utf-8"),o=Ai(t);if(zi(o))return;if(o===void 0){await gt(e,JSON.stringify({compilerOptions:{strictNullChecks:!0}},null,2));return}let s=Si(t,["compilerOptions","strictNullChecks"],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}),r=Ci(t,s);await gt(e,r)}catch(t){console.warn(`Failed to update ${e}:`,t)}},Ee={exists:async()=>(await ut()).length>0,update:async()=>{let e=await ut();if(e.length===0){console.warn("No tsconfig.json files found in the project");return}await Promise.all(e.map(t=>Ui(t)))}};var wt=d.devDependencies["@biomejs/biome"],je=d.version,ht="^9.0.0",Bi={"@eslint/js":ht,"@typescript-eslint/eslint-plugin":d.devDependencies["@typescript-eslint/eslint-plugin"],"@typescript-eslint/parser":d.devDependencies["@typescript-eslint/parser"],eslint:ht,"eslint-config-prettier":d.devDependencies["eslint-config-prettier"],"eslint-import-resolver-typescript":d.devDependencies["eslint-import-resolver-typescript"],"eslint-plugin-compat":d.devDependencies["eslint-plugin-compat"],"eslint-plugin-cypress":d.devDependencies["eslint-plugin-cypress"],"eslint-plugin-github":d.devDependencies["eslint-plugin-github"],"eslint-plugin-html":d.devDependencies["eslint-plugin-html"],"eslint-plugin-import-x":d.devDependencies["eslint-plugin-import-x"],"eslint-plugin-n":d.devDependencies["eslint-plugin-n"],"eslint-plugin-prettier":d.devDependencies["eslint-plugin-prettier"],"eslint-plugin-promise":d.devDependencies["eslint-plugin-promise"],"eslint-plugin-sonarjs":d.devDependencies["eslint-plugin-sonarjs"],"eslint-plugin-storybook":d.devDependencies["eslint-plugin-storybook"],"eslint-plugin-unicorn":d.devDependencies["eslint-plugin-unicorn"],"eslint-plugin-unused-imports":d.devDependencies["eslint-plugin-unused-imports"],globals:d.devDependencies.globals,prettier:"latest","prettier-plugin-svelte":d.devDependencies["prettier-plugin-svelte"],"prettier-plugin-tailwindcss":d.devDependencies["prettier-plugin-tailwindcss"],stylelint:"latest"},Di={angular:{"@angular-eslint/eslint-plugin":"latest"},astro:{"eslint-plugin-astro":d.devDependencies["eslint-plugin-astro"]},jest:{"eslint-plugin-jest":d.devDependencies["eslint-plugin-jest"]},next:{"@next/eslint-plugin-next":d.devDependencies["@next/eslint-plugin-next"]},qwik:{"eslint-plugin-qwik":d.devDependencies["eslint-plugin-qwik"]},react:{"@tanstack/eslint-plugin-query":d.devDependencies["@tanstack/eslint-plugin-query"],"eslint-plugin-jsx-a11y":d.devDependencies["eslint-plugin-jsx-a11y"],"eslint-plugin-react":d.devDependencies["eslint-plugin-react"],"eslint-plugin-react-hooks":d.devDependencies["eslint-plugin-react-hooks"]},remix:{"eslint-plugin-remix":d.devDependencies["eslint-plugin-remix"]},solid:{"eslint-plugin-solid":d.devDependencies["eslint-plugin-solid"]},svelte:{"eslint-plugin-svelte":d.devDependencies["eslint-plugin-svelte"]},vitest:{"@vitest/eslint-plugin":d.devDependencies["@vitest/eslint-plugin"]},vue:{"eslint-plugin-vue":d.devDependencies["eslint-plugin-vue"]}},vt=e=>{let t={...Bi};for(let o of e)Object.assign(t,Di[o]);return t},Pi=(e,t,o)=>{let i={ultracite:je};return e==="biome"&&(i["@biomejs/biome"]=wt),e==="eslint"&&Object.assign(i,vt(o)),e==="oxlint"&&(i.oxlint="latest",i.oxfmt="latest",t&&(i["oxlint-tsgolint"]="latest")),i},Fi=async(e,t="biome",o=!0,i=!1,s=!1,r=["react"])=>{let l=w();i||l.start("Installing dependencies...");let c=[`ultracite@${je}`];if(t==="biome"&&c.push(`@biomejs/biome@${wt}`),t==="eslint"&&c.push(...Object.entries(vt(r)).map(([f,u])=>`${f}@${u}`)),t==="oxlint"&&(c.push("oxlint@latest"),c.push("oxfmt@latest"),s&&c.push("oxlint-tsgolint@latest")),o)for(let f of c)await Ti(f,{corepack:!1,packageManager:e,silent:!0,workspace:await S()});else{let f=Pi(t,s,r);await k({devDependencies:f})}await k({scripts:{check:"ultracite check",fix:"ultracite fix"}}),i||l.stop("Dependencies installed.")},Ni=async(e=!1)=>{let t=w();if(e||t.start("Checking for tsconfig.json files..."),await Ee.exists()){e||t.message("Found tsconfig.json files, updating with strictNullChecks..."),await Ee.update(),e||t.stop("tsconfig.json files updated.");return}e||t.stop("No tsconfig.json files found, skipping.")},Oi=async(e,t="biome",o=!1)=>{let i=F.find(l=>l.id===e);if(!i)throw new Error(`Editor "${e}" not found`);let s=L1(e,t),r=w();if(o||r.start(`Checking for ${i.config.path}...`),await s.exists()){o||r.message(`${i.config.path} found, updating...`),await s.update(),o||r.stop(`${i.config.path} updated.`);return}if(o||r.message(`${i.config.path} not found, creating...`),await s.create(),s.extension){let l=re.find(c=>c.id===t)?.vscodeExtensionId;if(!l)throw new Error(`Linter extension not found for ${t}`);o||r.message(`Installing ${l} extension...`);try{if(s.extension(l).status===0){o||r.stop(`${i.config.path} created and ${l} extension installed.`);return}}catch{}o||r.stop(`${i.config.path} created. Install ${l} extension manually.`);return}o||(e==="zed"?r.stop(`${i.config.path} created. Install the Biome extension: https://biomejs.dev/reference/zed/`):r.stop(`${i.config.path} created.`))},Li=async(e,t=!1,o=!1)=>{let i=w();if(t||i.start("Checking for Biome configuration..."),await de.exists()){t||i.message("Biome configuration found, updating..."),await de.update({frameworks:e,typeAware:o}),t||i.stop("Biome configuration updated.");return}t||i.message("Biome configuration not found, creating..."),await de.create({frameworks:e,typeAware:o}),t||i.stop("Biome configuration created.")},Ri=async(e,t=!1)=>{let o=w();if(t||o.start("Checking for ESLint configuration..."),await pe.exists()){t||o.message("ESLint configuration found, updating..."),await pe.update({frameworks:e}),t||o.stop("ESLint configuration updated.");return}t||o.message("ESLint configuration not found, creating..."),await pe.create({frameworks:e}),t||o.stop("ESLint configuration created.")},Mi=async(e,t=!1)=>{let o=w();if(t||o.start("Checking for Oxlint configuration..."),await ge.exists()){t||o.message("Oxlint configuration found, updating..."),await ge.update({frameworks:e}),t||o.stop("Oxlint configuration updated.");return}t||o.message("Oxlint configuration not found, creating..."),await ge.create({frameworks:e}),t||o.stop("Oxlint configuration created.")},$i=async(e=!1)=>{let t=w();if(e||t.start("Checking for Prettier configuration..."),await ue.exists()){e||t.message("Prettier configuration found, updating..."),await ue.update(),e||t.stop("Prettier configuration updated.");return}e||t.message("Prettier configuration not found, creating..."),await ue.create(),e||t.stop("Prettier configuration created.")},_i=async(e=!1)=>{let t=w();if(e||t.start("Checking for Stylelint configuration..."),await he.exists()){e||t.message("Stylelint configuration found, updating..."),await he.update(),e||t.stop("Stylelint configuration updated.");return}e||t.message("Stylelint configuration not found, creating..."),await he.create(),e||t.stop("Stylelint configuration created.")},Vi=async(e=!1)=>{let t=w();if(e||t.start("Checking for oxfmt configuration..."),await me.exists()){e||t.message("oxfmt configuration found, updating..."),await me.update(),e||t.stop("oxfmt configuration updated.");return}e||t.message("oxfmt configuration not found, creating..."),await me.create(),e||t.stop("oxfmt configuration created.")},Wi=async(e,t=!0,o=!1,i=!1)=>{let s=w();if(o||(s.start("Initializing pre-commit hooks..."),s.message("Installing Husky...")),await(t?O.install(e):k({devDependencies:{husky:"latest"},scripts:{prepare:"husky"}})),o||s.message("Initializing Husky..."),O.init(e.name),await O.exists()){o||s.message("Pre-commit hook found, updating..."),await O.update(e.name,i),o||s.stop("Pre-commit hook updated.");return}o||s.message("Pre-commit hook not found, creating..."),await O.create(e.name,i),o||s.stop("Pre-commit hook created.")},Ji=async(e,t=!0,o=!1)=>{let i=w();if(o||(i.start("Initializing lefthook..."),i.message("Installing lefthook...")),await(t?J.install(e):k({devDependencies:{lefthook:"latest"}})),await J.exists()){o||i.message("lefthook.yml found, updating..."),await J.update(e.name),o||i.stop("lefthook.yml updated.");return}o||i.message("lefthook.yml not found, creating..."),await J.create(e.name),o||i.stop("lefthook.yml created.")},qi=async(e,t=!0,o=!1)=>{let i=w();if(o||(i.start("Initializing lint-staged..."),i.message("Installing lint-staged...")),await(t?H.install(e):k({devDependencies:{"lint-staged":"latest"}})),await H.exists()){o||i.message("lint-staged found, updating..."),await H.update(e.name),o||i.stop("lint-staged updated.");return}o||i.message("lint-staged not found, creating..."),await H.create(e.name),o||i.stop("lint-staged created.")},Hi=async(e,t=!1)=>{let o=w();if(t||o.start("Initializing pre-commit..."),await ce.exists()){t||o.message(".pre-commit-config.yaml found, updating..."),await ce.update(e),t||o.stop(".pre-commit-config.yaml updated.");return}t||o.message(".pre-commit-config.yaml not found, creating..."),await ce.create(e),t||o.stop(".pre-commit-config.yaml created.")},yt=async(e,t,o,i,s=!1)=>{let r=w();s||r.start(`Checking for ${t}...`);let l=O1(e,o,i);if(await l.exists()){s||r.message(`${t} found, updating...`),await l.update(),s||r.stop(`${t} updated.`);return}s||r.message(`${t} not found, creating...`),await l.create(),s||r.stop(`${t} created.`)},Ki=async(e,t,o,i=!1)=>{let s=`${e.displayName} (${e.path})`;await yt(e.representativeAgentId,s,t,o,i)},Qi=async(e,t,o="biome",i=!1)=>{let s=w(),r=$.find(c=>c.id===e)?.name??e;i||s.start(`Checking for ${r} hooks...`);let l=R1(e,t,o);if(await l.exists()){i||s.message(`${r} hooks found, updating...`),await l.update(),i||s.stop(`${r} hooks updated.`);return}i||s.message(`${r} hooks not found, creating...`),await l.create(),i||s.stop(`${r} hooks created.`)},kt=async e=>{let t=e??{},o=t.quiet??!1;o||Ei(`Ultracite v${je} Initialization`);try{let{pm:i}=t,s;if(i)s={command:i,name:i};else{let p=await Gi(Ii.cwd());if(!p)throw new Error("No package manager specified or detected");if(!o&&p.warnings)for(let g of p.warnings)Z.warn(g);o||Z.info(`Detected lockfile, using ${p.name}`),i=p.name,s=p}let{linter:r}=t;if(r===void 0)if(o||t.pm||t.editors||t.agents||t.hooks||t.integrations!==void 0||t.frameworks!==void 0)r="biome";else{let g=await ji({message:"Which linter do you want to use?",options:[{label:"Biome (Recommended)",value:"biome"},{label:"ESLint + Prettier + Stylelint",value:"eslint"},{label:"Oxlint + Oxfmt",value:"oxlint"}]});if(R(g)){L("Operation cancelled.");return}r=g}let{frameworks:l}=t;if(l===void 0)if(o||t.pm||t.editors||t.agents||t.hooks||t.integrations!==void 0)l=[];else{let g=await Y({message:"Which frameworks are you using (optional)?",options:[{label:"React",value:"react"},{label:"Next.js",value:"next"},{label:"Solid",value:"solid"},{label:"Vue",value:"vue"},{label:"Svelte",value:"svelte"},{label:"Qwik",value:"qwik"},{label:"Angular",value:"angular"},{label:"Remix / TanStack Router / React Router",value:"remix"},{label:"Astro",value:"astro"},{label:"NestJS",value:"nestjs"},{label:"Jest",value:"jest"},{label:"Vitest / Bun",value:"vitest"}],required:!1});if(R(g)){L("Operation cancelled.");return}l=g}let c=t.editors;if(!c)if(o)c=[];else{let p=await Y({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1});if(R(p)){L("Operation cancelled.");return}c=p}let{agents:f}=t,u=[],{hooks:y}=t,B=N1(),D=B.find(p=>p.id==="universal"),we=Object.fromEntries(j.map(p=>[p.id,p.name]));if(f){if(f.includes("universal")&&D){u=[D];let p=new Set(D.agentIds);f=f.filter(g=>g!=="universal"&&!p.has(g))}}else if(o)f=[];else{let p=await Y({message:"Which agent files do you want to add (optional)?",options:B.map(g=>({label:g.promptLabel,value:g.id})),required:!1});if(R(p)){L("Operation cancelled.");return}u=B.filter(g=>p.includes(g.id))}let bt=Object.fromEntries($.map(p=>[p.id,p.name]));if(!y)if(o)y=[];else{let p=await Y({message:"Which agent hooks do you want to enable (optional)?",options:Object.entries(bt).map(([g,Ct])=>({label:Ct,value:g})),required:!1});if(R(p)){L("Operation cancelled.");return}y=p}let{integrations:C}=t;if(C===void 0)if(o||t.pm||t.editors||t.agents||t.hooks)C=[];else{let g=await Y({message:"Would you like any of the following (optional)?",options:[{label:"Husky pre-commit hook",value:"husky"},{label:"Lefthook pre-commit hook",value:"lefthook"},{label:"Lint-staged",value:"lint-staged"},{label:"pre-commit (Python framework)",value:"pre-commit"}],required:!1});if(R(g)){L("Operation cancelled.");return}C=g}await Fi(s,r,!t.skipInstall,o,t["type-aware"],l),await Ni(o),r==="biome"&&await Li(l,o,t["type-aware"]),r==="eslint"&&(await Ri(l,o),await $i(o),await _i(o)),r==="oxlint"&&(await Mi(l,o),await Vi(o));for(let p of c??[])await Oi(p,r,o);for(let p of u)await Ki(p,i,r,o);for(let p of f??[])await yt(p,we[p],i,r,o);for(let p of y??[])await Qi(p,i,r,o);if(C?.includes("husky")){let p=C?.includes("lint-staged")??!1;await Wi(s,!t.skipInstall,o,p)}C?.includes("lefthook")&&await Ji(s,!t.skipInstall,o),C?.includes("lint-staged")&&await qi(s,!t.skipInstall,o),C?.includes("pre-commit")&&await Hi(i,o),o||Z.success("Successfully initialized Ultracite!");let xt=await ft({packageManager:i,quiet:o,shouldInstall:t.installSkill});!o&&!xt&&Z.info(`You can install the Ultracite skill later with \`${mt(i)}\`.`)}catch(i){let s=i instanceof Error?i.message:"Unknown error";throw o||Z.error(`Failed to initialize Ultracite configuration: ${s}`),i}};var M=new Zi;M.name("ultracite").version(d.version).description(d.description);M.command("init").description("Initialize Ultracite in the current directory").option("--pm <pm>","Package manager to use").option("--linter <linter>","Linter to use").option("--editors <editors...>","Editors to configure").option("--agents <agents...>","Agents to enable (use universal for AGENTS.md)").option("--hooks <hooks...>","Hooks to enable").option("--frameworks <frameworks...>","Frameworks being used").option("--integrations <integrations...>","Integrations to enable").option("--install-skill","Install the reusable Ultracite skill after setup").option("--type-aware","Enable type-aware linting (enables project/scanner rules)").option("--skip-install","Skip installing dependencies").option("--quiet","Suppress interactive prompts").action(async e=>{await kt({agents:e.agents,editors:e.editors,frameworks:e.frameworks,hooks:e.hooks,installSkill:e.installSkill,integrations:e.integrations,linter:e.linter,pm:e.pm,quiet:e.quiet??(process.env.CI==="true"||process.env.CI==="1"),skipInstall:e.skipInstall,"type-aware":e.typeAware})});M.command("check").argument("[files...]","Files to check").description("Run linter without fixing files. Unknown options are passed to the underlying linter.").allowUnknownOption().action(async e=>{let t=process.argv.indexOf("check"),i=process.argv.slice(t+1).filter(r=>r.startsWith("-")),s=e.filter(r=>!r.startsWith("--"));await Pe(s,i)});M.command("fix").argument("[files...]","Files to fix").description("Run linter and fix files. Unknown options are passed to the underlying linter.").allowUnknownOption().action(async e=>{let t=process.argv.indexOf("fix"),i=process.argv.slice(t+1).filter(r=>r.startsWith("-")),s=e.filter(r=>!r.startsWith("--"));await Ne(s,i)});M.command("doctor").description("Verify your Ultracite setup").action(async()=>{await Fe()});process.env.TEST||M.parse();export{M as program};
|