44 * This file handles interactive prompts and external CLI initialization
55 */
66
7- import { autocompleteMultiselect , group , log , multiselect , spinner } from "@clack/prompts" ;
7+ import { autocompleteMultiselect , group , log , multiselect , select , spinner } from "@clack/prompts" ;
88import { $ } from "execa" ;
99import pc from "picocolors" ;
1010
@@ -13,62 +13,89 @@ import type { ProjectConfig } from "../../types";
1313import { exitCancelled } from "../../utils/errors" ;
1414import { getPackageExecutionArgs } from "../../utils/package-runner" ;
1515
16- type UltraciteEditor = "vscode" | "zed" ;
17- type UltraciteAgent =
18- | "vscode-copilot"
16+ type UltraciteEditor =
17+ | "vscode"
1918 | "cursor"
2019 | "windsurf"
21- | "zed"
20+ | "antigravity"
21+ | "kiro"
22+ | "trae"
23+ | "void"
24+ | "zed" ;
25+
26+ type UltraciteAgent =
2227 | "claude"
2328 | "codex"
24- | "kiro"
29+ | "jules"
30+ | "copilot"
2531 | "cline"
2632 | "amp"
2733 | "aider"
2834 | "firebase-studio"
2935 | "open-hands"
30- | "gemini-cli "
36+ | "gemini"
3137 | "junie"
3238 | "augmentcode"
3339 | "kilo-code"
3440 | "goose"
35- | "roo-code" ;
41+ | "roo-code"
42+ | "warp"
43+ | "droid"
44+ | "opencode"
45+ | "crush"
46+ | "qwen"
47+ | "amazon-q-cli"
48+ | "firebender" ;
3649
37- type UltraciteHook = "cursor" | "claude " ;
50+ type UltraciteHook = "cursor" | "windsurf " ;
3851
39- const EDITORS = {
40- vscode : {
41- label : "VSCode / Cursor / Windsurf" ,
42- } ,
43- zed : {
44- label : "Zed" ,
45- } ,
46- } as const ;
52+ type UltraciteLinter = "biome" | "eslint" | "oxlint" ;
4753
48- const AGENTS = {
49- " vscode-copilot" : { label : "VS Code Copilot " } ,
54+ const EDITORS = {
55+ vscode : { label : "VS Code" } ,
5056 cursor : { label : "Cursor" } ,
5157 windsurf : { label : "Windsurf" } ,
58+ antigravity : { label : "Antigravity" } ,
59+ kiro : { label : "Kiro" } ,
60+ trae : { label : "Trae" } ,
61+ void : { label : "Void" } ,
5262 zed : { label : "Zed" } ,
63+ } as const ;
64+
65+ const AGENTS = {
5366 claude : { label : "Claude" } ,
5467 codex : { label : "Codex" } ,
55- kiro : { label : "Kiro" } ,
68+ jules : { label : "Jules" } ,
69+ copilot : { label : "GitHub Copilot" } ,
5670 cline : { label : "Cline" } ,
5771 amp : { label : "Amp" } ,
5872 aider : { label : "Aider" } ,
5973 "firebase-studio" : { label : "Firebase Studio" } ,
6074 "open-hands" : { label : "Open Hands" } ,
61- " gemini-cli" : { label : "Gemini CLI " } ,
75+ gemini : { label : "Gemini" } ,
6276 junie : { label : "Junie" } ,
6377 augmentcode : { label : "AugmentCode" } ,
6478 "kilo-code" : { label : "Kilo Code" } ,
6579 goose : { label : "Goose" } ,
6680 "roo-code" : { label : "Roo Code" } ,
81+ warp : { label : "Warp" } ,
82+ droid : { label : "Droid" } ,
83+ opencode : { label : "OpenCode" } ,
84+ crush : { label : "Crush" } ,
85+ qwen : { label : "Qwen" } ,
86+ "amazon-q-cli" : { label : "Amazon Q CLI" } ,
87+ firebender : { label : "Firebender" } ,
6788} as const ;
6889
6990const HOOKS = {
7091 cursor : { label : "Cursor" } ,
71- claude : { label : "Claude" } ,
92+ windsurf : { label : "Windsurf" } ,
93+ } as const ;
94+
95+ const LINTERS = {
96+ biome : { label : "Biome (recommended)" } ,
97+ oxlint : { label : "OxLint" } ,
98+ eslint : { label : "ESLint" } ,
7299} as const ;
73100
74101function getFrameworksFromFrontend ( frontend : string [ ] ) : string [ ] {
@@ -107,6 +134,15 @@ export async function setupUltracite(config: ProjectConfig, hasHusky: boolean) {
107134
108135 const result = await group (
109136 {
137+ linter : ( ) =>
138+ select < UltraciteLinter > ( {
139+ message : "Choose linter/formatter" ,
140+ options : Object . entries ( LINTERS ) . map ( ( [ key , linter ] ) => ( {
141+ value : key as UltraciteLinter ,
142+ label : linter . label ,
143+ } ) ) ,
144+ initialValue : "biome" as UltraciteLinter ,
145+ } ) ,
110146 editors : ( ) =>
111147 multiselect < UltraciteEditor > ( {
112148 message : "Choose editors" ,
@@ -127,7 +163,7 @@ export async function setupUltracite(config: ProjectConfig, hasHusky: boolean) {
127163 } ) ,
128164 hooks : ( ) =>
129165 autocompleteMultiselect < UltraciteHook > ( {
130- message : "Choose hooks" ,
166+ message : "Choose hooks (optional) " ,
131167 options : Object . entries ( HOOKS ) . map ( ( [ key , hook ] ) => ( {
132168 value : key as UltraciteHook ,
133169 label : hook . label ,
@@ -141,12 +177,13 @@ export async function setupUltracite(config: ProjectConfig, hasHusky: boolean) {
141177 } ,
142178 ) ;
143179
180+ const linter = result . linter as UltraciteLinter ;
144181 const editors = result . editors as UltraciteEditor [ ] ;
145182 const agents = result . agents as UltraciteAgent [ ] ;
146183 const hooks = result . hooks as UltraciteHook [ ] ;
147184 const frameworks = getFrameworksFromFrontend ( frontend ) ;
148185
149- const ultraciteArgs = [ "init" , "--pm" , packageManager ] ;
186+ const ultraciteArgs = [ "init" , "--pm" , packageManager , "--linter" , linter ] ;
150187
151188 if ( frameworks . length > 0 ) {
152189 ultraciteArgs . push ( "--frameworks" , ...frameworks ) ;
0 commit comments