@@ -102,6 +102,12 @@ interface IProviderSelectionResult {
102102 summary: string ;
103103}
104104
105+ export interface IProviderChoice {
106+ label: string ;
107+ provider ? : Provider ;
108+ custom: boolean ;
109+ }
110+
105111interface IInitProjectReview {
106112 cwd: string ;
107113 projectName: string ;
@@ -270,6 +276,45 @@ export function buildProviderSummary(provider: Provider, detectedProviders: Prov
270276 return `Auto-selected ${ providerName } . Also available: ${ otherNames } . Use --provider to override.` ;
271277}
272278
279+ export function shouldPromptProviderOverride (
280+ interactive : boolean ,
281+ detectedProviders : Provider [ ] ,
282+ ) : boolean {
283+ return interactive && detectedProviders . length > 1 ;
284+ }
285+
286+ export function buildProviderChoices (
287+ detectedProviders : Provider [ ] ,
288+ includeCustomProvider : boolean = true ,
289+ ) : IProviderChoice [ ] {
290+ const choices : IProviderChoice [ ] = detectedProviders . map ( ( provider ) => ( {
291+ label : formatProviderName ( provider ) ,
292+ provider,
293+ custom : false ,
294+ } ) ) ;
295+
296+ if ( includeCustomProvider ) {
297+ choices . push ( {
298+ label : 'Custom provider command' ,
299+ custom : true ,
300+ } ) ;
301+ }
302+
303+ return choices ;
304+ }
305+
306+ export function selectProviderOverrideByIndex (
307+ choices : IProviderChoice [ ] ,
308+ input : string ,
309+ ) : IProviderChoice | null {
310+ const selectedIndex = Number . parseInt ( input . trim ( ) , 10 ) ;
311+ if ( ! Number . isInteger ( selectedIndex ) || selectedIndex < 1 || selectedIndex > choices . length ) {
312+ return null ;
313+ }
314+
315+ return choices [ selectedIndex - 1 ] ?? null ;
316+ }
317+
273318function createCustomProviderSelection ( params : {
274319 command ?: string ;
275320 name ?: string ;
@@ -333,6 +378,73 @@ async function promptCustomProviderSelection(): Promise<IProviderSelectionResult
333378 return createCustomProviderSelection ( { command, name, id } ) ;
334379}
335380
381+ async function promptProviderOverrideSelection ( params : {
382+ selectedProvider : Provider ;
383+ detectedProviders : Provider [ ] ;
384+ detectedCommands : string [ ] ;
385+ } ) : Promise < IProviderSelectionResult > {
386+ const { selectedProvider, detectedProviders, detectedCommands } = params ;
387+ const selectedName = formatProviderName ( selectedProvider ) ;
388+ console . log ( buildProviderSummary ( selectedProvider , detectedProviders ) ) ;
389+
390+ const useAutoSelected = await promptYesNo ( `Use ${ selectedName } ?` , false ) ;
391+ if ( useAutoSelected ) {
392+ return {
393+ provider : selectedProvider ,
394+ detectedProviders,
395+ detectedCommands,
396+ summary : `Using auto-selected provider: ${ selectedName } .` ,
397+ } ;
398+ }
399+
400+ const choices = buildProviderChoices ( detectedProviders ) ;
401+ console . log ( '\nDetected provider presets:' ) ;
402+ choices . forEach ( ( choice , index ) => {
403+ console . log ( ` ${ index + 1 } . ${ choice . label } ` ) ;
404+ } ) ;
405+
406+ const choiceInput = await promptText ( 'Choose provider preset number' ) ;
407+ const choice = selectProviderOverrideByIndex ( choices , choiceInput ) ;
408+ if ( ! choice ) {
409+ warn ( `Invalid provider choice. Continuing with auto-selected provider: ${ selectedName } .` ) ;
410+ return {
411+ provider : selectedProvider ,
412+ detectedProviders,
413+ detectedCommands,
414+ summary : `Using auto-selected provider: ${ selectedName } .` ,
415+ } ;
416+ }
417+
418+ if ( choice . custom ) {
419+ const command = await promptText ( 'Custom provider command' ) ;
420+ if ( ! command ) {
421+ warn (
422+ `No custom provider command entered. Continuing with auto-selected provider: ${ selectedName } .` ,
423+ ) ;
424+ return {
425+ provider : selectedProvider ,
426+ detectedProviders,
427+ detectedCommands,
428+ summary : `Using auto-selected provider: ${ selectedName } .` ,
429+ } ;
430+ }
431+
432+ const name = await promptText ( 'Custom provider display name (optional)' ) ;
433+ const id = await promptText ( 'Custom provider id (default: custom)' ) ;
434+ const customSelection = createCustomProviderSelection ( { command, name, id } ) ;
435+ if ( customSelection ) {
436+ return customSelection ;
437+ }
438+ }
439+
440+ return {
441+ provider : choice . provider ?? selectedProvider ,
442+ detectedProviders ,
443+ detectedCommands ,
444+ summary : `Using provider selected during guided init : ${choice . label } . `,
445+ };
446+ }
447+
336448async function resolveProviderSelection(
337449 options: IInitOptions,
338450 interactive: boolean,
@@ -385,6 +497,14 @@ async function resolveProviderSelection(
385497 }
386498
387499 const selectedProvider = chooseProviderByPrecedence(detectedProviders);
500+ if (shouldPromptProviderOverride(interactive, detectedProviders)) {
501+ return promptProviderOverrideSelection({
502+ selectedProvider,
503+ detectedProviders,
504+ detectedCommands,
505+ });
506+ }
507+
388508 return {
389509 provider: selectedProvider,
390510 detectedProviders,
0 commit comments