ultracite 6.3.12 → 6.4.0
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 +30 -27
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var re=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var lt=Object.prototype.hasOwnProperty;var ae=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')}),Pe=t=>e=>{var n=t[e];if(n)return n();throw new Error("Module not found in bundle: "+e)};var U=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{for(var n in e)re(t,n,{get:e[n],enumerable:!0})},dt=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ct(e))!lt.call(t,o)&&o!==n&&re(t,o,{get:()=>e[o],enumerable:!(s=at(e,o))||s.enumerable});return t};var le=t=>dt(re({},"__esModule",{value:!0}),t);import{access as kt,readFile as Re,writeFile as bt}from"fs/promises";import{parse as xt}from"jsonc-parser";var f,C,z,v,vt,Ct,G,h=U(()=>{"use strict";f=async t=>{try{return await kt(t),!0}catch{return!1}},C=async()=>{if(await f("pnpm-workspace.yaml"))return!0;try{let t=xt(await Re("package.json","utf-8"));return t?!!t.workspaces||!!t.workspace:!1}catch{return!1}},z=`
|
|
3
3
|
888 888 888 88888888888 8888888b. d8888 .d8888b. 8888888 88888888888 8888888888
|
|
4
4
|
888 888 888 888 888 Y88b d88888 d88P Y88b 888 888 888
|
|
5
5
|
888 888 888 888 888 888 d88P888 888 888 888 888 888
|
|
@@ -8,7 +8,7 @@ var q=Object.defineProperty;var Ze=Object.getOwnPropertyDescriptor;var qe=Object
|
|
|
8
8
|
888 888 888 888 888 T88b d88P 888 888 888 888 888 888
|
|
9
9
|
Y88b. .d88P 888 888 888 T88b d8888888888 Y88b d88P 888 888 888
|
|
10
10
|
"Y88888P" 88888888 888 888 T88b d88P 888 "Y8888P" 8888888 888 8888888888
|
|
11
|
-
`,
|
|
11
|
+
`,v=async({dependencies:t,devDependencies:e,scripts:n})=>{let s=await Re("package.json","utf8"),o=JSON.parse(s),i={...o};(o.devDependencies||e)&&(i.devDependencies={...o.devDependencies,...e}),(o.dependencies||t)&&(i.dependencies={...o.dependencies,...t}),(o.scripts||n)&&(i.scripts={...o.scripts,...n}),await bt("package.json",JSON.stringify(i,null,2))},vt=/[ $(){}[\]&|;<>!"'`*?#~]/,Ct=/'/g,G=t=>t.map(e=>vt.test(e)?`'${e.replace(Ct,"'\\''")}' `:e)});var Xe={};ce(Xe,{husky:()=>P});import{execSync as Cn}from"child_process";import{mkdir as jn,readFile as Sn,writeFile as Ye}from"fs/promises";import{addDevDependency as Pn,dlxCommand as we}from"nypm";var Ke,ne,P,ke=U(()=>{"use strict";h();Ke=t=>`#!/bin/sh
|
|
12
12
|
# Exit on any error
|
|
13
13
|
set -e
|
|
14
14
|
|
|
@@ -76,10 +76,10 @@ if [ "$STAGED_HASH" != "$NEW_STAGED_HASH" ]; then
|
|
|
76
76
|
fi
|
|
77
77
|
|
|
78
78
|
exit $FORMAT_EXIT_CODE
|
|
79
|
-
`,
|
|
80
|
-
${s}`)}}});var
|
|
79
|
+
`,ne="./.husky/pre-commit",P={exists:()=>f(ne),install:async t=>{await Pn("husky",{packageManager:t,workspace:await C()}),await v({scripts:{prepare:"husky"}})},init:t=>{let e=we(t,"husky",{args:["init"]});try{Cn(e,{stdio:"inherit"})}catch{}},create:async t=>{await jn(".husky",{recursive:!0});let e=we(t,"ultracite",{args:["fix"],short:t==="npm"}),n=Ke(e);await Ye(ne,n)},update:async t=>{let e=await Sn(ne,"utf-8"),n=we(t,"ultracite",{args:["fix"],short:t==="npm"}),s=Ke(n);await Ye(ne,`${e}
|
|
80
|
+
${s}`)}}});var et={};ce(et,{lefthook:()=>D});import{execSync as $n}from"child_process";import{readFile as Rn,writeFile as L}from"fs/promises";import{addDevDependency as En,dlxCommand as Ze}from"nypm";var An,Fn,qe,$,Qe,D,be=U(()=>{"use strict";h();An=/(pre-commit:\s*\n\s*jobs:\s*\n)/,Fn=/(pre-commit:\s*\n)/,qe=t=>Ze(t,"ultracite",{args:["fix"],short:t==="npm"}),$="./lefthook.yml",Qe=t=>`pre-commit:
|
|
81
81
|
jobs:
|
|
82
|
-
- run: ${
|
|
82
|
+
- run: ${qe(t)}
|
|
83
83
|
glob:
|
|
84
84
|
- "*.js"
|
|
85
85
|
- "*.jsx"
|
|
@@ -89,7 +89,7 @@ ${s}`)}}});var Be={};te(Be,{lefthook:()=>E});import{execSync as ao}from"child_pr
|
|
|
89
89
|
- "*.jsonc"
|
|
90
90
|
- "*.css"
|
|
91
91
|
stage_fixed: true
|
|
92
|
-
`,
|
|
92
|
+
`,D={exists:()=>f($),install:async t=>{await En("lefthook",{packageManager:t,workspace:await C()}),await v({scripts:{prepare:"lefthook install"}});let e=Ze(t,"lefthook",{args:["install"],short:t==="npm"});$n(e,{stdio:"inherit"})},create:async t=>{let e=Qe(t);await L($,e)},update:async t=>{let e=await Rn($,"utf-8"),n=qe(t),s=Qe(t);if(e.includes(n))return;if(e.startsWith("# EXAMPLE USAGE:")){await L($,s);return}if(e.includes("pre-commit:"))if(e.includes("jobs:")){let i=` - run: ${n}
|
|
93
93
|
glob:
|
|
94
94
|
- "*.js"
|
|
95
95
|
- "*.jsx"
|
|
@@ -98,9 +98,9 @@ ${s}`)}}});var Be={};te(Be,{lefthook:()=>E});import{execSync as ao}from"child_pr
|
|
|
98
98
|
- "*.json"
|
|
99
99
|
- "*.jsonc"
|
|
100
100
|
- "*.css"
|
|
101
|
-
stage_fixed: true`,
|
|
102
|
-
`);await
|
|
103
|
-
- run: ${
|
|
101
|
+
stage_fixed: true`,r=e.replace(An,`$1${i}
|
|
102
|
+
`);await L($,r)}else{let i=` jobs:
|
|
103
|
+
- run: ${n}
|
|
104
104
|
glob:
|
|
105
105
|
- "*.js"
|
|
106
106
|
- "*.jsx"
|
|
@@ -109,26 +109,29 @@ ${s}`)}}});var Be={};te(Be,{lefthook:()=>E});import{execSync as ao}from"child_pr
|
|
|
109
109
|
- "*.json"
|
|
110
110
|
- "*.jsonc"
|
|
111
111
|
- "*.css"
|
|
112
|
-
stage_fixed: true`,
|
|
113
|
-
`);await
|
|
114
|
-
${s}`)}}});var
|
|
115
|
-
`).filter(i=>i.trim()&&!i.trim().startsWith("#")),
|
|
116
|
-
`;for(let
|
|
117
|
-
`}else e+=`${
|
|
118
|
-
`;return e},
|
|
119
|
-
`;await
|
|
120
|
-
`;await
|
|
121
|
-
`)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
112
|
+
stage_fixed: true`,r=e.replace(Fn,`$1${i}
|
|
113
|
+
`);await L($,r)}else await L($,`${e}
|
|
114
|
+
${s}`)}}});var Dn,xe=U(()=>{Dn=Pe({"./husky.ts":()=>(ke(),le(Xe)),"./lefthook.ts":()=>(be(),le(et)),"./lint-staged.ts":()=>(ve(),le(tt))})});var tt={};ce(tt,{lintStaged:()=>O});import{readFile as se,writeFile as R}from"fs/promises";import{pathToFileURL as On}from"url";import W from"deepmerge";import{parse as je}from"jsonc-parser";import{addDevDependency as Nn,dlxCommand as Mn}from"nypm";var S,nt,Tn,Un,In,Jn,_n,Bn,Ln,Wn,Hn,Ce,zn,O,ve=U(()=>{"use strict";h();xe();S=t=>({"*.{js,jsx,ts,tsx,json,jsonc,css,scss,md,mdx}":[Mn(t,"ultracite",{args:["fix"],short:t==="npm"})]}),nt=["./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"],Tn=(t,e,n,s)=>{let o=t.trim();if(o.includes(":")&&!o.startsWith("-")){n&&s.length>0&&(e[n]=s);let[i,...r]=o.split(":"),a=r.join(":").trim(),c=i.trim().replace(/['"]/g,"");return a&&a!==""?(a.startsWith("[")&&a.endsWith("]")?e[c]=a.slice(1,-1).split(",").map(p=>p.trim().replace(/['"]/g,"")):e[c]=a.replace(/['"]/g,""),{newCurrentKey:null,newCurrentArray:[]}):{newCurrentKey:c,newCurrentArray:[]}}if(o.startsWith("-")&&n){let i=[...s,o.slice(1).trim().replace(/['"]/g,"")];return{newCurrentKey:n,newCurrentArray:i}}return{newCurrentKey:n,newCurrentArray:s}},Un=t=>{let e=t.split(`
|
|
115
|
+
`).filter(i=>i.trim()&&!i.trim().startsWith("#")),n={},s=null,o=[];for(let i of e){let r=Tn(i,n,s,o);s=r.newCurrentKey,o=r.newCurrentArray}return s&&o.length>0&&(n[s]=o),n},In=t=>{let e="";for(let[n,s]of Object.entries(t))if(Array.isArray(s)){e+=`${n}:
|
|
116
|
+
`;for(let o of s)e+=` - '${o}'
|
|
117
|
+
`}else e+=`${n}: '${s}'
|
|
118
|
+
`;return e},Jn=async()=>{try{let t=je(await se("./package.json","utf-8"));return t?t.type==="module":!1}catch{return!1}},_n=async t=>{let e=je(await se("./package.json","utf-8"));e&&(e["lint-staged"]?e["lint-staged"]=W(e["lint-staged"],S(t)):e["lint-staged"]=S(t),await R("./package.json",JSON.stringify(e,null,2)))},Bn=async(t,e)=>{let n=await se(t,"utf-8"),s=je(n);if(!s)return;let o=W(s,S(e));await R(t,JSON.stringify(o,null,2))},Ln=async(t,e)=>{let n=await se(t,"utf-8"),s=Un(n);if(!s)return;let o=W(s,S(e));await R(t,In(o))},Wn=async(t,e)=>{let o=(await import(On(t).href)).default||{},i=W(o,S(e)),r=`export default ${JSON.stringify(i,null,2)};
|
|
119
|
+
`;await R(t,r)},Hn=async(t,e)=>{delete ae.cache[ae.resolve(`./${t}`)];let n=Dn(`./${t}`),s=W(n,S(e)),o=`module.exports = ${JSON.stringify(s,null,2)};
|
|
120
|
+
`;await R(t,o)},Ce=async t=>{await R(".lintstagedrc.json",JSON.stringify(S(t),null,2))},zn=async(t,e)=>{if(t==="./package.json"){await _n(e);return}if(t.endsWith(".json")||t==="./.lintstagedrc"){await Bn(t,e);return}if(t.endsWith(".yaml")||t.endsWith(".yml")){await Ln(t,e);return}let n=await Jn();if(t.endsWith(".mjs")||t.endsWith(".js")&&n){try{await Wn(t,e)}catch{await Ce(e)}return}if(t.endsWith(".cjs")||t.endsWith(".js")&&!n)try{await Hn(t,e)}catch{await Ce(e)}},O={exists:async()=>{for(let t of nt)if(await f(t))return!0;return!1},install:async t=>{await Nn("lint-staged",{packageManager:t,workspace:await C()})},create:async t=>{await R(".lintstagedrc.json",JSON.stringify(S(t),null,2))},update:async t=>{let e=null;for(let n of nt)if(await f(n)){e=n;break}if(!e){await Ce(t);return}await zn(e,t)}}});import{initTRPC as gs}from"@trpc/server";import{createCli as hs}from"trpc-cli";import l from"zod";var k={name:"ultracite",description:"The AI-ready formatter that helps you write and generate code faster.",version:"6.4.0",type:"module",bin:{ultracite:"dist/index.js"},files:["config","dist","README.md"],scripts:{build:"tsup",test:"bun test","test:coverage":"bun test --coverage"},exports:{"./*":"./config/*/biome.jsonc"},author:"Hayden Bleasel <hello@haydenbleasel.com>",bugs:{url:"https://github.com/haydenbleasel/ultracite/issues"},homepage:"https://www.ultracite.ai/",keywords:["ultracite","biome","linter","formatter","fixer"],license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},repository:{type:"git",url:"git+https://github.com/haydenbleasel/ultracite.git"},devDependencies:{"@biomejs/biome":"2.3.8","@types/node":"^25.0.0",tsup:"^8.5.1",turbo:"^2.6.3"},dependencies:{"@clack/prompts":"^0.11.0","@trpc/server":"^11.7.2",deepmerge:"^4.3.1",glob:"^13.0.0","jsonc-parser":"^3.3.1",nypm:"^0.6.2",picocolors:"^1.1.1","trpc-cli":"^0.12.1",zod:"^4.1.13"},packageManager:"bun@1.3.4"};import{spawnSync as jt}from"child_process";import St from"process";import{detectPackageManager as Pt,dlxCommand as $t}from"nypm";import m from"picocolors";var b=t=>`\x1B[38;5;208m${t}\x1B[39m`,$e=(t,e)=>{let s=t.slice(0,e[0]).split(`
|
|
121
|
+
`);return{line:s.length,column:(s.at(-1)?.length??0)+1}},mt=(t,e)=>{let n=t.split(`
|
|
122
|
+
`),{line:s,column:o}=$e(t,e),i=[],r=Math.max(1,s-1),a=Math.min(n.length,s+2);for(let c=r;c<=a;c++){let p=String(c).padStart(5," "),u=n[c-1]||"";if(c===s){i.push(`${b(">")}${m.dim(p)} ${m.gray("\u2502")} ${u}`);let x=" ".repeat(o-1),y=Math.min(e[1]-e[0],u.length-o+1),d="^".repeat(Math.max(1,y));i.push(`${m.dim(" ")} ${m.gray("\u2502")} ${x}${b(d)}`)}else i.push(` ${m.dim(p)} ${m.gray("\u2502")} ${u}`)}return i},pt=t=>{let e=t.secs*1e3+t.nanos/1e6;return e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(2)}s`},ut=m.dim("\u2500".repeat(60)),gt=t=>["",`${b("Ultracite")} ${b(`v${k.version}`)} ${t}`],ht=(t,e)=>{let n=[],s=t.changed+t.unchanged,o=t.errors+t.warnings,i=pt(t.duration);if(o>0){let a=o!==1?"errors":"error";n.push(`${m.dim("Found")} ${o} ${a}${m.dim(".")}`)}let r=s!==1?"files":"file";if(n.push(`${m.green("\u2713")} ${m.dim("Finished in")} ${i} ${m.dim("on")} ${s} ${r}${m.dim(".")}`),e==="fix"&&t.changed>0){let a=t.changed!==1?"files":"file";n.push(`${m.dim("Fixed")} ${t.changed} ${a}${m.dim(".")}`)}return n},yt=t=>{let e=[],{location:n,category:s,description:o,advices:i}=t,r=n.path.file,a=r;if(n.span&&n.sourceCode){let{line:c,column:p}=$e(n.sourceCode,n.span);a=`${r}:${c}:${p}`}if(e.push(`${b(a)} ${m.dim(s)}`),e.push(m.dim(o)),n.span&&n.sourceCode){e.push("");let c=mt(n.sourceCode,n.span);for(let p of c)e.push(` ${p}`)}for(let c of i.advices)if(c.log){let[p,u]=c.log,x=b(p==="info"?"i":"!"),y=m.dim(u.map(d=>d.content).join(""));e.push(""),e.push(` ${x} ${y}`)}return e.push(""),e.push(`${ut}`),e.push(""),e},wt=(t,e)=>{let n=e==="fix"?t.filter(i=>!i.tags.includes("fixable")):t;if(n.length===0)return[];let s=[""],o=e==="fix"?"Here are the issues we couldn't fix automatically:":"Issues found:";s.push(`${m.yellow(o)}`),s.push("");for(let i of n)s.push(...yt(i));return s},H=(t,e)=>{if(!t.trim())return{output:`${b("Ultracite")} ${b(`v${k.version}`)} ${m.magenta(e)}
|
|
123
|
+
${m.red("Error:")} No output received from Biome. The command may have failed silently.`,hasErrors:!0};try{let n=JSON.parse(t),{summary:s,diagnostics:o}=n;return{output:[...gt(e),...ht(s,e),...wt(o,e)].join(`
|
|
124
|
+
`),hasErrors:s.errors>0}}catch{return{output:`${b("Ultracite")} ${b(`v${k.version}`)} ${m.magenta(e)}
|
|
125
|
+
${m.red("Error:")} Failed to parse Biome output.
|
|
126
|
+
|
|
127
|
+
Raw output:
|
|
128
|
+
${t}`,hasErrors:!0}}};h();var de=async t=>{let e=t?.[0]||[],n=t?.[1]["diagnostic-level"],s=["check","--no-errors-on-unmatched","--reporter=json"];n&&s.push(`--diagnostic-level=${n}`),e.length>0?s.push(...G(e)):s.push("./");let i=(await Pt(St.cwd()))?.name||"npm",r=$t(i,"@biomejs/biome",{args:s,short:i==="npm"}),a=jt(r,{stdio:"pipe",shell:!0,maxBuffer:100*1024*1024});if(a.error)throw new Error(`Failed to run Ultracite: ${a.error.message}`);let c=a.stdout?.toString()||"",p=a.stderr?.toString()||"",u=c.trim().startsWith("{")?c:p,{output:x,hasErrors:y}=H(u,"check");return console.log(x),{hasErrors:y}};import{spawnSync as Lt}from"child_process";import{existsSync as I}from"fs";import{readFile as Me}from"fs/promises";import{join as J}from"path";import A from"process";import{intro as Wt,log as K,outro as pe,spinner as Ht}from"@clack/prompts";import{parse as zt}from"jsonc-parser";import{detectPackageManager as Gt,dlxCommand as Vt}from"nypm";h();import{readFile as Ee,unlink as Rt,writeFile as Et}from"fs/promises";import{parse as Ae}from"jsonc-parser";import{removeDependency as At}from"nypm";var V=[".eslintrc",".eslintrc.js",".eslintrc.json",".eslintrc.yml",".eslintrc.yaml",".eslintrc.config.js","eslint.config.js","eslint.config.mjs","eslint.config.cjs",".eslintignore"],Fe=async()=>{try{let t=await Ee("package.json","utf-8"),e=Ae(t);if(!e||typeof e!="object")return[];let n=e.dependencies||{},s=e.devDependencies||{},o={...n,...s};return Object.keys(o).filter(i=>i.includes("eslint"))}catch{return[]}},Ft=async(t,e)=>{if(e.length!==0)try{for(let n of e)await At(n,{packageManager:t})}catch(n){console.warn(n)}},Dt=async()=>{let t=[];for(let e of V)if(await f(e))try{await Rt(e),t.push(e)}catch(n){console.warn(n)}return t},Ot=async()=>{let t="./.vscode/settings.json";if(!await f(t))return!1;try{let e=await Ee(t,"utf-8"),n=Ae(e);if(!n||typeof n!="object")return!1;let s=!1,o={...n},i=["eslint.enable","eslint.format.enable","eslint.validate","eslint.workingDirectories","eslint.codeAction.showDocumentation","eslint.run","eslint.autoFixOnSave","eslint.quiet","eslint.packageManager","eslint.options","eslint.trace.server"];for(let r of i)r in o&&(delete o[r],s=!0);if("editor.codeActionsOnSave"in o){let r=o["editor.codeActionsOnSave"];if(r&&typeof r=="object"){let a=["source.fixAll.eslint","source.organizeImports.eslint"];for(let c of a)c in r&&(delete r[c],s=!0);Object.keys(r).length===0&&(o["editor.codeActionsOnSave"]=void 0)}}return s?(await Et(t,JSON.stringify(o,null,2)),!0):!1}catch(e){return console.warn(e),!1}},Nt=async()=>{if((await Fe()).length>0)return!0;for(let e of V)if(await f(e))return!0;return!1},fe={hasEsLint:Nt,remove:async t=>{let e=await Fe();await Ft(t,e);let n=await Dt(),s=await Ot();return{packagesRemoved:e,filesRemoved:n,vsCodeCleaned:s}}};h();import{readFile as De,unlink as Mt,writeFile as Tt}from"fs/promises";import{parse as Oe}from"jsonc-parser";import{removeDependency as Ut}from"nypm";var Y=[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml",".prettierrc.config.js","prettier.config.js","prettier.config.mjs",".prettierignore"],Ne=async()=>{try{let t=await De("package.json","utf-8"),e=Oe(t);if(!e||typeof e!="object")return[];let n=e.dependencies||{},s=e.devDependencies||{},o={...n,...s};return Object.keys(o).filter(i=>i.includes("prettier"))}catch{return[]}},It=async(t,e)=>{if(e.length!==0)try{for(let n of e)await Ut(n,{packageManager:t})}catch(n){console.warn(n)}},Jt=async()=>{let t=[];for(let e of Y)if(await f(e))try{await Mt(e),t.push(e)}catch(n){console.warn(n)}return t},_t=async()=>{let t="./.vscode/settings.json";if(!await f(t))return!1;try{let e=await De(t,"utf-8"),n=Oe(e);if(!n||typeof n!="object")return!1;let s=!1,o={...n},i=["editor.defaultFormatter","prettier.enable","prettier.requireConfig","prettier.configPath","prettier.printWidth","prettier.tabWidth","prettier.useTabs","prettier.semi","prettier.singleQuote","prettier.quoteProps","prettier.trailingComma","prettier.bracketSpacing","prettier.arrowParens","prettier.endOfLine"];for(let a of i)a in o&&(a==="editor.defaultFormatter"&&o[a]==="esbenp.prettier-vscode"||a!=="editor.defaultFormatter")&&(delete o[a],s=!0);let r=Object.keys(o).filter(a=>a.startsWith("[")&&a.includes("javascript"));for(let a of r){let c=o[a];c&&typeof c=="object"&&"editor.defaultFormatter"in c&&c["editor.defaultFormatter"]==="esbenp.prettier-vscode"&&(delete c["editor.defaultFormatter"],s=!0,Object.keys(c).length===0&&delete o[a])}return s?(await Tt(t,JSON.stringify(o,null,2)),!0):!1}catch(e){return console.warn(e),!1}},Bt=async()=>{if((await Ne()).length>0)return!0;for(let e of Y)if(await f(e))return!0;return!1},me={hasPrettier:Bt,remove:async t=>{let e=await Ne();await It(t,e);let n=await Jt(),s=await _t();return{packagesRemoved:e,filesRemoved:n,vsCodeCleaned:s}}};h();var Yt=async()=>{let e=(await Gt(A.cwd()))?.name||"npm",n=Vt(e,"@biomejs/biome",{args:["--version"],short:e==="npm"}),s=Lt(n,{shell:!0,encoding:"utf-8"});return s.status===0&&s.stdout?{name:"Biome installation",status:"pass",message:`Biome is installed (${s.stdout.trim()})`}:{name:"Biome installation",status:"fail",message:"Biome is not installed or not accessible"}},Kt=async()=>{let t=J(A.cwd(),"biome.json"),e=J(A.cwd(),"biome.jsonc"),n=null;if(I(t)?n=t:I(e)&&(n=e),!n)return{name:"Biome configuration",status:"fail",message:"No biome.json or biome.jsonc file found"};try{let s=await Me(n,"utf-8"),o=zt(s);return Array.isArray(o?.extends)&&o.extends.includes("ultracite/core")?{name:"Biome configuration",status:"pass",message:"biome.json(c) extends ultracite/core"}:{name:"Biome configuration",status:"warn",message:"biome.json(c) exists but doesn't extend ultracite/core"}}catch{return{name:"Biome configuration",status:"fail",message:"Could not parse biome.json(c) file"}}},Xt=async()=>{let t=J(A.cwd(),"package.json");if(!I(t))return{name:"Ultracite dependency",status:"warn",message:"No package.json found"};try{let e=JSON.parse(await Me(t,"utf-8")),n=e.dependencies?.ultracite||e.devDependencies?.ultracite||e.peerDependencies?.ultracite;return n?{name:"Ultracite dependency",status:"pass",message:`Ultracite is in package.json (${n})`}:{name:"Ultracite dependency",status:"warn",message:"Ultracite not found in package.json dependencies"}}catch{return{name:"Ultracite dependency",status:"warn",message:"Could not parse package.json"}}},Qt=()=>{let t=Y.some(n=>I(J(A.cwd(),n))),e=V.some(n=>I(J(A.cwd(),n)));if(t||e){let n=[];return t&&n.push("Prettier"),e&&n.push("ESLint"),{name:"Conflicting tools",status:"warn",message:`Found potentially conflicting tools: ${n.join(", ")}`}}return{name:"Conflicting tools",status:"pass",message:"No conflicting formatting/linting tools found"}},X=async(t,e)=>{let n=Ht();n.start(`Checking ${e}...`);let s=await t();return s.status==="pass"||s.status,n.stop(s.message),s},Te=async()=>{Wt(z);let t=[];t.push(await X(Yt,"Biome installation")),t.push(await X(Kt,"Biome configuration")),t.push(await X(Xt,"Ultracite dependency")),t.push(await X(Qt,"conflicting tools"));let e=t.filter(o=>o.status==="pass").length,n=t.filter(o=>o.status==="fail").length,s=t.filter(o=>o.status==="warn").length;if(K.info(`Summary: ${e} passed, ${s} warnings, ${n} failed`),n>0)throw K.error("Some checks failed. Run 'npx ultracite init' to fix issues."),pe("Doctor complete"),new Error("Doctor checks failed");if(s>0){K.warn("Some optional improvements available. Run 'npx ultracite init' to configure."),pe("Doctor complete");return}K.success("Everything looks good!"),pe("Doctor complete")};import{spawnSync as Zt}from"child_process";import qt from"process";import{detectPackageManager as en,dlxCommand as tn}from"nypm";h();var ue=async(t,e={})=>{let n=["check","--write","--no-errors-on-unmatched","--reporter=json"];e.unsafe&&n.push("--unsafe"),t.length>0?n.push(...G(t)):n.push("./");let o=(await en(qt.cwd()))?.name||"npm",i=tn(o,"@biomejs/biome",{args:n,short:o==="npm"}),r=Zt(i,{stdio:"pipe",shell:!0,maxBuffer:100*1024*1024});if(r.error)throw new Error(`Failed to run Ultracite: ${r.error.message}`);let a=r.stdout?.toString()||"",c=r.stderr?.toString()||"",p=a.trim().startsWith("{")?a:c,{output:u,hasErrors:x}=H(p,"fix");return console.log(u),{hasErrors:x}};import{packageManagers as nn}from"nypm";var j={packageManagers:nn.map(t=>t.name),editorConfigs:["vscode","zed"],agents:["vscode-copilot","cursor","windsurf","zed","claude","codex","kiro","cline","amp","aider","firebase-studio","open-hands","gemini-cli","junie","augmentcode","kilo-code","goose","roo-code","warp","droid"],integrations:["husky","lefthook","lint-staged"],hooks:["cursor","claude"],frameworks:["react","next","solid","vue","svelte","qwik","remix","angular","astro"],migrations:["eslint","prettier"]};import qn from"process";import{cancel as N,intro as es,isCancel as M,log as oe,multiselect as T,spinner as w}from"@clack/prompts";import{addDevDependency as ts,detectPackageManager as ns}from"nypm";import{mkdir as sn,readFile as on,writeFile as Q}from"fs/promises";import{dirname as rn}from"path";var Ue={"vscode-copilot":{path:"./.github/copilot-instructions.md",header:`---
|
|
126
129
|
applyTo: "**/*.{ts,tsx,js,jsx}"
|
|
127
130
|
---`,appendMode:!0},cursor:{path:"./.cursor/rules/ultracite.mdc",header:`---
|
|
128
131
|
description: Ultracite Rules - AI-Ready Formatter and Linter
|
|
129
132
|
globs: "**/*.{ts,tsx,js,jsx,json,jsonc,html,vue,svelte,astro,css,yaml,yml,graphql,gql,md,mdx,grit}"
|
|
130
133
|
alwaysApply: false
|
|
131
|
-
---`},windsurf:{path:"./.windsurf/rules/ultracite.md"},zed:{path:"./.rules",appendMode:!0},claude:{path:"./.claude/CLAUDE.md",appendMode:!0},codex:{path:"./AGENTS.md",appendMode:!0},kiro:{path:"./.kiro/steering/ultracite.md"},cline:{path:"./.clinerules",appendMode:!0},amp:{path:"./AGENT.md",appendMode:!0},aider:{path:"./ultracite.md"},"firebase-studio":{path:"./.idx/airules.md",appendMode:!0},"open-hands":{path:"./.openhands/microagents/repo.md",appendMode:!0},"gemini-cli":{path:"./GEMINI.md",appendMode:!0},junie:{path:"./.junie/guidelines.md",appendMode:!0},augmentcode:{path:"./.augment/rules/ultracite.md"},"kilo-code":{path:"./.kilocode/rules/ultracite.md"},goose:{path:"./.goosehints",appendMode:!0},"roo-code":{path:"./.roo/rules/ultracite.md",appendMode:!0},warp:{path:"./WARP.md",appendMode:!0},droid:{path:"./AGENTS.md",appendMode:!0}}
|
|
134
|
+
---`},windsurf:{path:"./.windsurf/rules/ultracite.md"},zed:{path:"./.rules",appendMode:!0},claude:{path:"./.claude/CLAUDE.md",appendMode:!0},codex:{path:"./AGENTS.md",appendMode:!0},kiro:{path:"./.kiro/steering/ultracite.md"},cline:{path:"./.clinerules",appendMode:!0},amp:{path:"./AGENT.md",appendMode:!0},aider:{path:"./ultracite.md"},"firebase-studio":{path:"./.idx/airules.md",appendMode:!0},"open-hands":{path:"./.openhands/microagents/repo.md",appendMode:!0},"gemini-cli":{path:"./GEMINI.md",appendMode:!0},junie:{path:"./.junie/guidelines.md",appendMode:!0},augmentcode:{path:"./.augment/rules/ultracite.md"},"kilo-code":{path:"./.kilocode/rules/ultracite.md"},goose:{path:"./.goosehints",appendMode:!0},"roo-code":{path:"./.roo/rules/ultracite.md",appendMode:!0},warp:{path:"./WARP.md",appendMode:!0},droid:{path:"./AGENTS.md",appendMode:!0}},Ie={cursor:{path:"./.cursor/hooks.json",command:"npx ultracite fix"},claude:{path:"./.claude/settings.json",command:"npx ultracite fix"}};h();var _=`# Ultracite Code Standards
|
|
132
135
|
|
|
133
136
|
This project uses **Ultracite**, a zero-config Biome preset that enforces strict code quality standards through automated formatting and linting.
|
|
134
137
|
|
|
@@ -251,8 +254,8 @@ Biome's linter will catch most issues automatically. Focus your attention on:
|
|
|
251
254
|
---
|
|
252
255
|
|
|
253
256
|
Most formatting and common issues are automatically fixed by Biome. Run \`npx ultracite fix\` before committing to ensure compliance.
|
|
254
|
-
`;var
|
|
257
|
+
`;var Je=t=>{let e=Ue[t],n=e.header?`${e.header}
|
|
255
258
|
|
|
256
|
-
${
|
|
259
|
+
${_}`:_,s=async()=>{let o=rn(e.path);if(o!=="."){let i=o.startsWith("./")?o.slice(2):o;await sn(i,{recursive:!0})}};return{exists:()=>f(e.path),create:async()=>{await s(),await Q(e.path,n)},update:async()=>{if(await s(),e.appendMode){if(!await f(e.path)){await Q(e.path,n);return}let o=await on(e.path,"utf-8");if(o.includes(_.trim()))return;await Q(e.path,`${o}
|
|
257
260
|
|
|
258
|
-
${U}`)}else await z(e.path,o)}}};p();import{readFile as Ht,writeFile as Oe}from"fs/promises";import Wt from"deepmerge";import{parse as zt}from"jsonc-parser";var De={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite/core"]},re=async()=>await l("./biome.json")?"./biome.json":"./biome.jsonc",B={exists:async()=>{let t=await re();return l(t)},create:async t=>{let e=await re(),o=["ultracite/core"];if(t?.frameworks&&t.frameworks.length>0)for(let n of t.frameworks)o.push(`ultracite/${n}`);let s={...De,extends:o};return Oe(e,JSON.stringify(s,null,2))},update:async t=>{let e=await re(),o=await Ht(e,"utf-8"),n=zt(o)||{},a=[...n.extends&&Array.isArray(n.extends)?n.extends:[]];if(a.includes("ultracite/core")||a.push("ultracite/core"),t?.frameworks&&t.frameworks.length>0)for(let h of t.frameworks){let O=`ultracite/${h}`;a.includes(O)||a.push(O)}n.extends=a;let r={$schema:De.$schema},f=Wt(n,r);await Oe(e,JSON.stringify(f,null,2))}};import{mkdir as Bt,readFile as Te,writeFile as R}from"fs/promises";import{dirname as Gt}from"path";p();var Me=t=>{let e=$e[t],o=async()=>{let s=Gt(e.path);if(s!=="."){let n=s.startsWith("./")?s.slice(2):s;await Bt(n,{recursive:!0})}};return{exists:()=>l(e.path),create:async()=>{await o(),t==="cursor"?await R(e.path,JSON.stringify({version:1,hooks:{afterFileEdit:[{command:e.command}]}},null,2)):t==="claude"&&await R(e.path,JSON.stringify({hooks:{PostToolUse:[{matcher:"Edit|Write",hooks:[{type:"command",command:e.command}]}]}},null,2))},update:async()=>{if(await o(),t==="cursor"){if(!await l(e.path)){await R(e.path,JSON.stringify({version:1,hooks:{afterFileEdit:[{command:e.command}]}},null,2));return}let s=await Te(e.path,"utf-8"),n=JSON.parse(s);n.hooks.afterFileEdit.some(a=>a.command.includes("ultracite"))||(n.hooks.afterFileEdit.push({command:e.command}),await R(e.path,JSON.stringify(n,null,2)))}else if(t==="claude"){if(!await l(e.path)){await R(e.path,JSON.stringify({hooks:{PostToolUse:[{matcher:"Edit|Write",hooks:[{type:"command",command:e.command}]}]}},null,2));return}let s=await Te(e.path,"utf-8"),n=JSON.parse(s);n.hooks||(n.hooks={}),n.hooks.PostToolUse||(n.hooks.PostToolUse=[]),n.hooks.PostToolUse.some(a=>a.hooks?.some(r=>r.command.includes("ultracite")))||(n.hooks.PostToolUse.push({matcher:"Edit|Write",hooks:[{type:"command",command:e.command}]}),await R(e.path,JSON.stringify(n,null,2)))}}}};p();import{spawnSync as Vt}from"child_process";import{mkdir as Yt,readFile as Kt,writeFile as Ue}from"fs/promises";import Xt from"deepmerge";import{parse as Qt}from"jsonc-parser";var ce={"editor.defaultFormatter":"esbenp.prettier-vscode","[javascript]":{"editor.defaultFormatter":"biomejs.biome"},"[typescript]":{"editor.defaultFormatter":"biomejs.biome"},"[javascriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[typescriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[json]":{"editor.defaultFormatter":"biomejs.biome"},"[jsonc]":{"editor.defaultFormatter":"biomejs.biome"},"[css]":{"editor.defaultFormatter":"biomejs.biome"},"[graphql]":{"editor.defaultFormatter":"biomejs.biome"},"typescript.tsdk":"node_modules/typescript/lib","editor.formatOnSave":!0,"editor.formatOnPaste":!0,"emmet.showExpandedAbbreviation":"never","editor.codeActionsOnSave":{"source.fixAll.biome":"explicit","source.organizeImports.biome":"explicit"}};var G="./.vscode/settings.json",I={exists:()=>l(G),create:async()=>{await Yt(".vscode",{recursive:!0}),await Ue(G,JSON.stringify(ce,null,2))},update:async()=>{let t=await Kt(G,"utf-8"),o=Qt(t)||{},s=Xt(o,ce);await Ue(G,JSON.stringify(s,null,2))},extension:()=>Vt("code --install-extension biomejs.biome",{stdio:"inherit",shell:!0})};p();import{mkdir as Zt,readFile as qt,writeFile as Ie}from"fs/promises";import eo from"deepmerge";import{parse as to}from"jsonc-parser";var le={formatter:"language_server",format_on_save:"on",languages:{JavaScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TypeScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TSX:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}}},lsp:{"typescript-language-server":{settings:{typescript:{preferences:{includePackageJsonAutoImports:"on"}}}}}};var V="./.zed/settings.json",Y={exists:()=>l(V),create:async()=>{await Zt(".zed",{recursive:!0}),await Ie(V,JSON.stringify(le,null,2))},update:async()=>{let t=await qt(V,"utf-8"),o=to(t)||{},s=eo(o,le);await Ie(V,JSON.stringify(s,null,2))}};fe();me();ue();import{readFile as So,writeFile as Ro}from"fs/promises";import Eo from"deepmerge";import{glob as Ao}from"glob";import{parse as Fo}from"jsonc-parser";var $o={compilerOptions:{strictNullChecks:!0}},Ye=async()=>{try{return await Ao("**/tsconfig*.json",{ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**"],absolute:!1})}catch{return[]}},No=async t=>{try{let e=await So(t,"utf-8"),s=Fo(e)||{},n=Eo(s,$o);await Ro(t,JSON.stringify(n,null,2))}catch(e){console.warn(`Failed to update ${t}:`,e)}},we={exists:async()=>(await Ye()).length>0,update:async()=>{let t=await Ye();if(t.length===0){console.warn("No tsconfig.json files found in the project");return}await Promise.all(t.map(e=>No(e)))}};p();var Ke=b.devDependencies["@biomejs/biome"],Xe=b.version,Uo=async(t,e=!0,o=!1)=>{let s=u();o||s.start("Installing dependencies...");let n=[`ultracite@${Xe}`,`@biomejs/biome@${Ke}`];if(e)for(let i of n)await To(i,{packageManager:t,workspace:await w(),silent:o});else await g({devDependencies:{"@biomejs/biome":Ke,ultracite:Xe}});o||s.stop("Dependencies installed.")},Io=async(t=!1)=>{let e=u();if(t||e.start("Checking for tsconfig.json files..."),await we.exists()){t||e.message("Found tsconfig.json files, updating with strictNullChecks..."),await we.update(),t||e.stop("tsconfig.json files updated.");return}t||e.stop("No tsconfig.json files found, skipping.")},Jo=async(t=!1)=>{let e=u();if(t||e.start("Checking for .vscode/settings.json..."),await I.exists()){t||e.message("settings.json found, updating..."),await I.update(),t||e.stop("settings.json updated.");return}t||e.message("settings.json not found, creating..."),await I.create(),t||(e.message("settings.json created."),e.message("Installing Biome extension..."));try{I.extension(),t||e.stop("settings.json created.")}catch(o){t||e.stop(`Failed to install Biome extension (${o}), but continuing...`)}},_o=async(t=!1)=>{let e=u();if(t||e.start("Checking for .zed/settings.json..."),await Y.exists()){t||e.message("settings.json found, updating..."),await Y.update(),t||e.stop("settings.json updated.");return}t||e.message("settings.json not found, creating..."),await Y.create(),t||e.message("settings.json created. Install the Biome extension: https://biomejs.dev/reference/zed/")},Lo=async(t,e=!1)=>{let o=u();if(e||o.start("Checking for Biome configuration..."),await B.exists()){e||o.message("Biome configuration found, updating..."),await B.update({frameworks:t}),e||o.stop("Biome configuration updated.");return}e||o.message("Biome configuration not found, creating..."),await B.create({frameworks:t}),e||o.stop("Biome configuration created.")},Ho=async(t,e=!0,o=!1)=>{let s=u();if(o||(s.start("Initializing pre-commit hooks..."),s.message("Installing Husky...")),e?await x.install(t):await g({devDependencies:{husky:"latest"},scripts:{prepare:"husky"}}),o||s.message("Initializing Husky..."),x.init(t),await x.exists()){o||s.message("Pre-commit hook found, updating..."),await x.update(t),o||s.stop("Pre-commit hook updated.");return}o||s.message("Pre-commit hook not found, creating..."),await x.create(t),o||s.stop("Pre-commit hook created.")},Wo=async(t,e=!0,o=!1)=>{let s=u();if(o||(s.start("Initializing lefthook..."),s.message("Installing lefthook...")),e?await E.install(t):await g({devDependencies:{lefthook:"latest"}}),await E.exists()){o||s.message("lefthook.yml found, updating..."),await E.update(t),o||s.stop("lefthook.yml updated.");return}o||s.message("lefthook.yml not found, creating..."),await E.create(t),o||s.stop("lefthook.yml created.")},zo=async(t,e=!0,o=!1)=>{let s=u();if(o||(s.start("Initializing lint-staged..."),s.message("Installing lint-staged...")),e?await A.install(t):await g({devDependencies:{"lint-staged":"latest"}}),await A.exists()){o||s.message("lint-staged found, updating..."),await A.update(t),o||s.stop("lint-staged updated.");return}o||s.message("lint-staged not found, creating..."),await A.create(t),o||s.stop("lint-staged created.")},Bo=async(t,e,o=!1)=>{let s=u();o||s.start(`Checking for ${e}...`);let n=Ne(t);if(await n.exists()){o||s.message(`${e} found, updating...`),await n.update(),o||s.stop(`${e} updated.`);return}o||s.message(`${e} not found, creating...`),await n.create(),o||s.stop(`${e} created.`)},Go=async(t,e,o=!1)=>{let s=u();o||s.start(`Checking for ${e} hooks...`);let n=Me(t);if(await n.exists()){o||s.message(`${e} hooks found, updating...`),await n.update(),o||s.stop(`${e} hooks updated.`);return}o||s.message(`${e} hooks not found, creating...`),await n.create(),o||s.stop(`${e} hooks created.`)},Vo=async(t,e=!1)=>{let o=u();e||o.start("Removing Prettier dependencies and configuration...");try{let s=await ie.remove(t);e||(s.packagesRemoved.length>0&&o.message(`Removed Prettier packages: ${s.packagesRemoved.join(", ")}`),s.filesRemoved.length>0&&o.message(`Removed config files: ${s.filesRemoved.join(", ")}`),s.vsCodeCleaned&&o.message("Cleaned VS Code settings"),o.stop("Prettier removed successfully."))}catch{e||o.stop("Failed to remove Prettier completely, but continuing...")}},Yo=async(t,e=!1)=>{let o=u();e||o.start("Removing ESLint dependencies and configuration...");try{let s=await ne.remove(t);e||(s.packagesRemoved.length>0&&o.message(`Removed ESLint packages: ${s.packagesRemoved.join(", ")}`),s.filesRemoved.length>0&&o.message(`Removed config files: ${s.filesRemoved.join(", ")}`),s.vsCodeCleaned&&o.message("Cleaned VS Code settings"),o.stop("ESLint removed successfully."))}catch{e||o.stop("Failed to remove ESLint completely, but continuing...")}},Qe=async t=>{let e=t??{},o=e.quiet??!1;o||Do(xe);try{let{pm:s}=e;if(!s){let d=await Mo(Oo.cwd());if(!d)throw new Error("No package manager specified or detected");if(!o&&d.warnings)for(let m of d.warnings)Q.warn(m);o||Q.info(`Detected lockfile, using ${d.name}`),s=d.name}let n=e.migrate?.includes("prettier"),i=e.migrate?.includes("eslint");if(!o&&(n===void 0||i===void 0)){let d=[];if(n===void 0&&await ie.hasPrettier()&&d.push({label:"Remove Prettier (dependencies, config files, VS Code settings)",value:"prettier"}),i===void 0&&await ne.hasEsLint()&&d.push({label:"Remove ESLint (dependencies, config files, VS Code settings)",value:"eslint"}),d.length>0){let m=await N({message:"Remove existing formatters/linters (recommended for clean migration)?",options:d,required:!1});if($(m)){F("Operation cancelled.");return}n===void 0&&(n=m.includes("prettier")),i===void 0&&(i=m.includes("eslint"))}}o&&(n===void 0&&(n=!1),i===void 0&&(i=!1));let a=e.frameworks;if(a===void 0)if(o||e.pm||e.editors||e.agents||e.hooks||e.integrations!==void 0||e.migrate!==void 0)a=[];else{let m=await N({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"}],required:!1});if($(m)){F("Operation cancelled.");return}a=m}let r=e.editors;if(!r)if(o)r=[];else{let d=await N({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1});if($(d)){F("Operation cancelled.");return}r=d}let f=e.agents,h=e.hooks,O={"vscode-copilot":"GitHub Copilot (VSCode)",cursor:"Cursor",windsurf:"Windsurf",zed:"Zed",claude:"Claude Code",codex:"OpenAI Codex / Jules / OpenCode",kiro:"Kiro IDE",cline:"Cline",amp:"AMP",aider:"Aider","firebase-studio":"Firebase Studio","open-hands":"Open Hands","gemini-cli":"Gemini CLI",junie:"Junie",augmentcode:"Augment Code","kilo-code":"Kilo Code",goose:"Codename Goose","roo-code":"Roo Code",warp:"Warp",droid:"Droid"};if(!f)if(o)f=[];else{let d=await N({message:"Which agents do you want to enable (optional)?",options:Object.entries(O).map(([m,Z])=>({value:m,label:Z})),required:!1});if($(d)){F("Operation cancelled.");return}f=d}let ye={cursor:"Cursor",claude:"Claude Code"};if(!h)if(o)h=[];else{let d=await N({message:"Which agent hooks do you want to enable (optional)?",options:Object.entries(ye).map(([m,Z])=>({value:m,label:Z})),required:!1});if($(d)){F("Operation cancelled.");return}h=d}let P=e.integrations;if(P===void 0)if(o||e.pm||e.editors||e.agents||e.hooks||e.migrate!==void 0)P=[];else{let m=await N({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"}],required:!1});if($(m)){F("Operation cancelled.");return}P=m}n&&await Vo(s,o),i&&await Yo(s,o),await Uo(s,!e.skipInstall,o),await Io(o),await Lo(a,o),r?.includes("vscode")&&await Jo(o),r?.includes("zed")&&await _o(o);for(let d of f??[])await Bo(d,O[d],o);for(let d of h??[])await Go(d,ye[d],o);P?.includes("husky")&&await Ho(s,!e.skipInstall,o),P?.includes("lefthook")&&await Wo(s,!e.skipInstall,o),P?.includes("lint-staged")&&await zo(s,!e.skipInstall,o),o||Q.success("Successfully initialized Ultracite configuration!")}catch(s){let n=s instanceof Error?s.message:"Unknown error";throw o||Q.error(`Failed to initialize Ultracite configuration: ${n}`),s}};var j=Ko.meta().create(),Qo=j.router({init:j.procedure.meta({description:"Initialize Ultracite in the current directory"}).input(c.object({pm:c.enum(y.packageManagers).optional().describe("Package manager to use"),editors:c.array(c.enum(y.editorConfigs)).optional().describe("Editors to configure"),agents:c.array(c.enum(y.agents)).optional().describe("Agents to enable"),hooks:c.array(c.enum(y.hooks)).optional().describe("Hooks to enable"),frameworks:c.array(c.enum(y.frameworks)).optional().describe("Frameworks being used"),integrations:c.array(c.enum(y.integrations)).optional().describe("Additional integrations to enable"),migrate:c.array(c.enum(y.migrations)).optional().describe("Migration tools to remove (e.g., eslint, prettier). Removes dependencies, config files, and editor settings."),skipInstall:c.boolean().default(!1).describe("Skip installing dependencies"),quiet:c.boolean().default(process.env.CI==="true"||process.env.CI==="1").describe("Suppress all interactive prompts and visual output. Automatically enabled in CI environments.")})).mutation(async({input:t})=>{await Qe(t)}),check:j.procedure.meta({description:"Run Biome linter without fixing files"}).input(c.tuple([c.array(c.string()).optional().default([]).describe("specific files to lint"),c.object({"diagnostic-level":c.enum(["info","warn","error"]).optional().describe("level of diagnostics to show. In order, from the lowest to the most important: info, warn, error.")})]).optional()).query(async({input:t})=>{await se(t)}),fix:j.procedure.meta({description:"Run Biome linter and fixes files"}).input(c.tuple([c.array(c.string()).optional().default([]).describe("specific files to format"),c.object({unsafe:c.boolean().optional().describe("apply unsafe fixes")})])).mutation(async({input:t})=>{let[e,o]=t;await ae(e,{unsafe:o.unsafe})}),doctor:j.procedure.meta({description:"Verify your Ultracite setup and check for issues"}).query(async()=>{await Ae()}),lint:j.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'check' instead - Run Biome linter without fixing files"}).input(c.array(c.string()).optional().default([]).describe("specific files to lint")).query(async({input:t})=>{console.warn("\u26A0\uFE0F Warning: 'lint' command is deprecated. Please use 'check' instead."),await se([t,{}])}),format:j.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'fix' instead - Run Biome linter and fixes files"}).input(c.tuple([c.array(c.string()).optional().default([]).describe("specific files to format"),c.object({unsafe:c.boolean().optional().describe("apply unsafe fixes")})])).mutation(async({input:t})=>{let[e,o]=t;console.warn("\u26A0\uFE0F Warning: 'format' command is deprecated. Please use 'fix' instead."),await ae(e,{unsafe:o.unsafe})})}),Zo=Xo({router:Qo,name:b.name,version:b.version,description:b.description});process.env.TEST||Zo.run();export{Qo as router};
|
|
261
|
+
${_}`)}else await Q(e.path,n)}}};h();import{readFile as an,writeFile as _e}from"fs/promises";import cn from"deepmerge";import{parse as ln}from"jsonc-parser";var Be={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["ultracite/core"]},ge=async()=>await f("./biome.json")?"./biome.json":"./biome.jsonc",Z={exists:async()=>{let t=await ge();return f(t)},create:async t=>{let e=await ge(),n=["ultracite/core"];if(t?.frameworks&&t.frameworks.length>0)for(let o of t.frameworks)n.push(`ultracite/${o}`);let s={...Be,extends:n};return _e(e,JSON.stringify(s,null,2))},update:async t=>{let e=await ge(),n=await an(e,"utf-8"),o=ln(n)||{},r=[...o.extends&&Array.isArray(o.extends)?o.extends:[]];if(r.includes("ultracite/core")||r.push("ultracite/core"),t?.frameworks&&t.frameworks.length>0)for(let p of t.frameworks){let u=`ultracite/${p}`;r.includes(u)||r.push(u)}o.extends=r;let a={$schema:Be.$schema},c=cn(o,a);await _e(e,JSON.stringify(c,null,2))}};h();import{spawnSync as dn}from"child_process";import{mkdir as fn,readFile as mn,writeFile as Le}from"fs/promises";import pn from"deepmerge";import{parse as un}from"jsonc-parser";var he={"editor.defaultFormatter":"esbenp.prettier-vscode","[javascript]":{"editor.defaultFormatter":"biomejs.biome"},"[typescript]":{"editor.defaultFormatter":"biomejs.biome"},"[javascriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[typescriptreact]":{"editor.defaultFormatter":"biomejs.biome"},"[json]":{"editor.defaultFormatter":"biomejs.biome"},"[jsonc]":{"editor.defaultFormatter":"biomejs.biome"},"[css]":{"editor.defaultFormatter":"biomejs.biome"},"[graphql]":{"editor.defaultFormatter":"biomejs.biome"},"typescript.tsdk":"node_modules/typescript/lib","editor.formatOnSave":!0,"editor.formatOnPaste":!0,"emmet.showExpandedAbbreviation":"never","editor.codeActionsOnSave":{"source.fixAll.biome":"explicit","source.organizeImports.biome":"explicit"}};var q="./.vscode/settings.json",B={exists:()=>f(q),create:async()=>{await fn(".vscode",{recursive:!0}),await Le(q,JSON.stringify(he,null,2))},update:async()=>{let t=await mn(q,"utf-8"),n=un(t)||{},s=pn(n,he);await Le(q,JSON.stringify(s,null,2))},extension:()=>dn("code --install-extension biomejs.biome",{stdio:"inherit",shell:!0})};h();import{mkdir as gn,readFile as hn,writeFile as We}from"fs/promises";import yn from"deepmerge";import{parse as wn}from"jsonc-parser";var ye={formatter:"language_server",format_on_save:"on",languages:{JavaScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TypeScript:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}},TSX:{formatter:{language_server:{name:"biome"}},code_actions_on_format:{"source.fixAll.biome":!0,"source.organizeImports.biome":!0}}},lsp:{"typescript-language-server":{settings:{typescript:{preferences:{includePackageJsonAutoImports:"on"}}}}}};var ee="./.zed/settings.json",te={exists:()=>f(ee),create:async()=>{await gn(".zed",{recursive:!0}),await We(ee,JSON.stringify(ye,null,2))},update:async()=>{let t=await hn(ee,"utf-8"),n=wn(t)||{},s=yn(n,ye);await We(ee,JSON.stringify(s,null,2))}};import{mkdir as kn,readFile as He,writeFile as F}from"fs/promises";import{dirname as bn}from"path";h();var ze=t=>({version:1,hooks:{afterFileEdit:[{command:t}]}}),Ge=t=>({hooks:{PostToolUse:[{matcher:"Edit|Write",hooks:[{type:"command",command:t}]}]}}),xn=async(t,e)=>{if(!await f(t)){await F(t,JSON.stringify(ze(e),null,2));return}let n=await He(t,"utf-8"),s=JSON.parse(n);s.hooks.afterFileEdit.some(i=>i.command.includes("ultracite"))||(s.hooks.afterFileEdit.push({command:e}),await F(t,JSON.stringify(s,null,2)))},vn=async(t,e)=>{if(!await f(t)){await F(t,JSON.stringify(Ge(e),null,2));return}let n=await He(t,"utf-8"),s=JSON.parse(n);s.hooks||(s.hooks={}),s.hooks.PostToolUse||(s.hooks.PostToolUse=[]),s.hooks.PostToolUse.some(i=>i.hooks?.some(r=>r.command.includes("ultracite")))||(s.hooks.PostToolUse.push({matcher:"Edit|Write",hooks:[{type:"command",command:e}]}),await F(t,JSON.stringify(s,null,2)))},Ve=t=>{let e=Ie[t],n=async()=>{let s=bn(e.path);if(s!=="."){let o=s.startsWith("./")?s.slice(2):s;await kn(o,{recursive:!0})}};return{exists:()=>f(e.path),create:async()=>{await n(),t==="cursor"?await F(e.path,JSON.stringify(ze(e.command),null,2)):t==="claude"&&await F(e.path,JSON.stringify(Ge(e.command),null,2))},update:async()=>{await n(),t==="cursor"?await xn(e.path,e.command):t==="claude"&&await vn(e.path,e.command)}}};ke();be();ve();import{readFile as Gn,writeFile as Vn}from"fs/promises";import Yn from"deepmerge";import{glob as Kn}from"glob";import{parse as Xn}from"jsonc-parser";var Qn={compilerOptions:{strictNullChecks:!0}},st=async()=>{try{return await Kn("**/tsconfig*.json",{ignore:["**/node_modules/**","**/dist/**","**/build/**","**/.next/**"],absolute:!1})}catch{return[]}},Zn=async t=>{try{let e=await Gn(t,"utf-8"),s=Xn(e)||{},o=Yn(s,Qn);await Vn(t,JSON.stringify(o,null,2))}catch(e){console.warn(`Failed to update ${t}:`,e)}},Se={exists:async()=>(await st()).length>0,update:async()=>{let t=await st();if(t.length===0){console.warn("No tsconfig.json files found in the project");return}await Promise.all(t.map(e=>Zn(e)))}};h();var ot=k.devDependencies["@biomejs/biome"],it=k.version,ss=async(t,e=!0,n=!1)=>{let s=w();n||s.start("Installing dependencies...");let o=[`ultracite@${it}`,`@biomejs/biome@${ot}`];if(e)for(let i of o)await ts(i,{packageManager:t,workspace:await C(),silent:n});else await v({devDependencies:{"@biomejs/biome":ot,ultracite:it}});n||s.stop("Dependencies installed.")},os=async(t=!1)=>{let e=w();if(t||e.start("Checking for tsconfig.json files..."),await Se.exists()){t||e.message("Found tsconfig.json files, updating with strictNullChecks..."),await Se.update(),t||e.stop("tsconfig.json files updated.");return}t||e.stop("No tsconfig.json files found, skipping.")},is=async(t=!1)=>{let e=w();if(t||e.start("Checking for .vscode/settings.json..."),await B.exists()){t||e.message("settings.json found, updating..."),await B.update(),t||e.stop("settings.json updated.");return}t||e.message("settings.json not found, creating..."),await B.create(),t||(e.message("settings.json created."),e.message("Installing Biome extension..."));try{B.extension(),t||e.stop("settings.json created.")}catch(n){t||e.stop(`Failed to install Biome extension (${n}), but continuing...`)}},rs=async(t=!1)=>{let e=w();if(t||e.start("Checking for .zed/settings.json..."),await te.exists()){t||e.message("settings.json found, updating..."),await te.update(),t||e.stop("settings.json updated.");return}t||e.message("settings.json not found, creating..."),await te.create(),t||e.message("settings.json created. Install the Biome extension: https://biomejs.dev/reference/zed/")},as=async(t,e=!1)=>{let n=w();if(e||n.start("Checking for Biome configuration..."),await Z.exists()){e||n.message("Biome configuration found, updating..."),await Z.update({frameworks:t}),e||n.stop("Biome configuration updated.");return}e||n.message("Biome configuration not found, creating..."),await Z.create({frameworks:t}),e||n.stop("Biome configuration created.")},cs=async(t,e=!0,n=!1)=>{let s=w();if(n||(s.start("Initializing pre-commit hooks..."),s.message("Installing Husky...")),e?await P.install(t):await v({devDependencies:{husky:"latest"},scripts:{prepare:"husky"}}),n||s.message("Initializing Husky..."),P.init(t),await P.exists()){n||s.message("Pre-commit hook found, updating..."),await P.update(t),n||s.stop("Pre-commit hook updated.");return}n||s.message("Pre-commit hook not found, creating..."),await P.create(t),n||s.stop("Pre-commit hook created.")},ls=async(t,e=!0,n=!1)=>{let s=w();if(n||(s.start("Initializing lefthook..."),s.message("Installing lefthook...")),e?await D.install(t):await v({devDependencies:{lefthook:"latest"}}),await D.exists()){n||s.message("lefthook.yml found, updating..."),await D.update(t),n||s.stop("lefthook.yml updated.");return}n||s.message("lefthook.yml not found, creating..."),await D.create(t),n||s.stop("lefthook.yml created.")},ds=async(t,e=!0,n=!1)=>{let s=w();if(n||(s.start("Initializing lint-staged..."),s.message("Installing lint-staged...")),e?await O.install(t):await v({devDependencies:{"lint-staged":"latest"}}),await O.exists()){n||s.message("lint-staged found, updating..."),await O.update(t),n||s.stop("lint-staged updated.");return}n||s.message("lint-staged not found, creating..."),await O.create(t),n||s.stop("lint-staged created.")},fs=async(t,e,n=!1)=>{let s=w();n||s.start(`Checking for ${e}...`);let o=Je(t);if(await o.exists()){n||s.message(`${e} found, updating...`),await o.update(),n||s.stop(`${e} updated.`);return}n||s.message(`${e} not found, creating...`),await o.create(),n||s.stop(`${e} created.`)},ms=async(t,e,n=!1)=>{let s=w();n||s.start(`Checking for ${e} hooks...`);let o=Ve(t);if(await o.exists()){n||s.message(`${e} hooks found, updating...`),await o.update(),n||s.stop(`${e} hooks updated.`);return}n||s.message(`${e} hooks not found, creating...`),await o.create(),n||s.stop(`${e} hooks created.`)},ps=async(t,e=!1)=>{let n=w();e||n.start("Removing Prettier dependencies and configuration...");try{let s=await me.remove(t);e||(s.packagesRemoved.length>0&&n.message(`Removed Prettier packages: ${s.packagesRemoved.join(", ")}`),s.filesRemoved.length>0&&n.message(`Removed config files: ${s.filesRemoved.join(", ")}`),s.vsCodeCleaned&&n.message("Cleaned VS Code settings"),n.stop("Prettier removed successfully."))}catch{e||n.stop("Failed to remove Prettier completely, but continuing...")}},us=async(t,e=!1)=>{let n=w();e||n.start("Removing ESLint dependencies and configuration...");try{let s=await fe.remove(t);e||(s.packagesRemoved.length>0&&n.message(`Removed ESLint packages: ${s.packagesRemoved.join(", ")}`),s.filesRemoved.length>0&&n.message(`Removed config files: ${s.filesRemoved.join(", ")}`),s.vsCodeCleaned&&n.message("Cleaned VS Code settings"),n.stop("ESLint removed successfully."))}catch{e||n.stop("Failed to remove ESLint completely, but continuing...")}},rt=async t=>{let e=t??{},n=e.quiet??!1;n||es(z);try{let{pm:s}=e;if(!s){let d=await ns(qn.cwd());if(!d)throw new Error("No package manager specified or detected");if(!n&&d.warnings)for(let g of d.warnings)oe.warn(g);n||oe.info(`Detected lockfile, using ${d.name}`),s=d.name}let o=e.migrate?.includes("prettier"),i=e.migrate?.includes("eslint");if(!n&&(o===void 0||i===void 0)){let d=[];if(o===void 0&&await me.hasPrettier()&&d.push({label:"Remove Prettier (dependencies, config files, VS Code settings)",value:"prettier"}),i===void 0&&await fe.hasEsLint()&&d.push({label:"Remove ESLint (dependencies, config files, VS Code settings)",value:"eslint"}),d.length>0){let g=await T({message:"Remove existing formatters/linters (recommended for clean migration)?",options:d,required:!1});if(M(g)){N("Operation cancelled.");return}o===void 0&&(o=g.includes("prettier")),i===void 0&&(i=g.includes("eslint"))}}n&&(o===void 0&&(o=!1),i===void 0&&(i=!1));let r=e.frameworks;if(r===void 0)if(n||e.pm||e.editors||e.agents||e.hooks||e.integrations!==void 0||e.migrate!==void 0)r=[];else{let g=await T({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"}],required:!1});if(M(g)){N("Operation cancelled.");return}r=g}let a=e.editors;if(!a)if(n)a=[];else{let d=await T({message:"Which editors do you want to configure (recommended)?",options:[{label:"VSCode / Cursor / Windsurf",value:"vscode"},{label:"Zed",value:"zed"}],required:!1});if(M(d)){N("Operation cancelled.");return}a=d}let c=e.agents,p=e.hooks,u={"vscode-copilot":"GitHub Copilot (VSCode)",cursor:"Cursor",windsurf:"Windsurf",zed:"Zed",claude:"Claude Code",codex:"OpenAI Codex / Jules / OpenCode",kiro:"Kiro IDE",cline:"Cline",amp:"AMP",aider:"Aider","firebase-studio":"Firebase Studio","open-hands":"Open Hands","gemini-cli":"Gemini CLI",junie:"Junie",augmentcode:"Augment Code","kilo-code":"Kilo Code",goose:"Codename Goose","roo-code":"Roo Code",warp:"Warp",droid:"Droid"};if(!c)if(n)c=[];else{let d=await T({message:"Which agents do you want to enable (optional)?",options:Object.entries(u).map(([g,ie])=>({value:g,label:ie})),required:!1});if(M(d)){N("Operation cancelled.");return}c=d}let x={cursor:"Cursor",claude:"Claude Code"};if(!p)if(n)p=[];else{let d=await T({message:"Which agent hooks do you want to enable (optional)?",options:Object.entries(x).map(([g,ie])=>({value:g,label:ie})),required:!1});if(M(d)){N("Operation cancelled.");return}p=d}let y=e.integrations;if(y===void 0)if(n||e.pm||e.editors||e.agents||e.hooks||e.migrate!==void 0)y=[];else{let g=await T({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"}],required:!1});if(M(g)){N("Operation cancelled.");return}y=g}o&&await ps(s,n),i&&await us(s,n),await ss(s,!e.skipInstall,n),await os(n),await as(r,n),a?.includes("vscode")&&await is(n),a?.includes("zed")&&await rs(n);for(let d of c??[])await fs(d,u[d],n);for(let d of p??[])await ms(d,x[d],n);y?.includes("husky")&&await cs(s,!e.skipInstall,n),y?.includes("lefthook")&&await ls(s,!e.skipInstall,n),y?.includes("lint-staged")&&await ds(s,!e.skipInstall,n),n||oe.success("Successfully initialized Ultracite configuration!")}catch(s){let o=s instanceof Error?s.message:"Unknown error";throw n||oe.error(`Failed to initialize Ultracite configuration: ${o}`),s}};var E=gs.meta().create(),ys=E.router({init:E.procedure.meta({description:"Initialize Ultracite in the current directory"}).input(l.object({pm:l.enum(j.packageManagers).optional().describe("Package manager to use"),editors:l.array(l.enum(j.editorConfigs)).optional().describe("Editors to configure"),agents:l.array(l.enum(j.agents)).optional().describe("Agents to enable"),hooks:l.array(l.enum(j.hooks)).optional().describe("Hooks to enable"),frameworks:l.array(l.enum(j.frameworks)).optional().describe("Frameworks being used"),integrations:l.array(l.enum(j.integrations)).optional().describe("Additional integrations to enable"),migrate:l.array(l.enum(j.migrations)).optional().describe("Migration tools to remove (e.g., eslint, prettier). Removes dependencies, config files, and editor settings."),skipInstall:l.boolean().default(!1).describe("Skip installing dependencies"),quiet:l.boolean().default(process.env.CI==="true"||process.env.CI==="1").describe("Suppress all interactive prompts and visual output. Automatically enabled in CI environments.")})).mutation(async({input:t})=>{await rt(t)}),check:E.procedure.meta({description:"Run Biome linter without fixing files"}).input(l.tuple([l.array(l.string()).optional().default([]).describe("specific files to lint"),l.object({"diagnostic-level":l.enum(["info","warn","error"]).optional().describe("level of diagnostics to show. In order, from the lowest to the most important: info, warn, error.")})]).optional()).query(async({input:t})=>{await de(t)}),fix:E.procedure.meta({description:"Run Biome linter and fixes files"}).input(l.tuple([l.array(l.string()).optional().default([]).describe("specific files to format"),l.object({unsafe:l.boolean().optional().describe("apply unsafe fixes")})])).mutation(async({input:t})=>{let[e,n]=t;await ue(e,{unsafe:n.unsafe})}),doctor:E.procedure.meta({description:"Verify your Ultracite setup and check for issues"}).query(async()=>{await Te()}),lint:E.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'check' instead - Run Biome linter without fixing files"}).input(l.array(l.string()).optional().default([]).describe("specific files to lint")).query(async({input:t})=>{console.warn("\u26A0\uFE0F Warning: 'lint' command is deprecated. Please use 'check' instead."),await de([t,{}])}),format:E.procedure.meta({description:"\u26A0\uFE0F DEPRECATED: Use 'fix' instead - Run Biome linter and fixes files"}).input(l.tuple([l.array(l.string()).optional().default([]).describe("specific files to format"),l.object({unsafe:l.boolean().optional().describe("apply unsafe fixes")})])).mutation(async({input:t})=>{let[e,n]=t;console.warn("\u26A0\uFE0F Warning: 'format' command is deprecated. Please use 'fix' instead."),await ue(e,{unsafe:n.unsafe})})}),ws=hs({router:ys,name:k.name,version:k.version,description:k.description});process.env.TEST||ws.run();export{ys as router};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ultracite",
|
|
3
3
|
"description": "The AI-ready formatter that helps you write and generate code faster.",
|
|
4
|
-
"version": "6.
|
|
4
|
+
"version": "6.4.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"ultracite": "dist/index.js"
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"glob": "^13.0.0",
|
|
54
54
|
"jsonc-parser": "^3.3.1",
|
|
55
55
|
"nypm": "^0.6.2",
|
|
56
|
+
"picocolors": "^1.1.1",
|
|
56
57
|
"trpc-cli": "^0.12.1",
|
|
57
58
|
"zod": "^4.1.13"
|
|
58
59
|
},
|