@@ -264,6 +264,16 @@ var devCommand = cli.Command{
264264 Aliases : []string {"config" },
265265 Usage : "Path to Stainless config file" ,
266266 },
267+ & cli.StringFlag {
268+ Name : "branch" ,
269+ Aliases : []string {"b" },
270+ Usage : "Which branch to use" ,
271+ },
272+ & cli.StringSliceFlag {
273+ Name : "target" ,
274+ Aliases : []string {"t" },
275+ Usage : "The target build language(s)" ,
276+ },
267277 & cli.BoolFlag {
268278 Name : "watch" ,
269279 Aliases : []string {"w" },
@@ -288,7 +298,68 @@ func runPreview(ctx context.Context, cmd *cli.Command) error {
288298 }
289299
290300 var selectedBranch string
301+ if cmd .IsSet ("branch" ) {
302+ selectedBranch = cmd .String ("branch" )
303+ } else {
304+ selectedBranch , err = chooseBranch (gitUser )
305+ if err != nil {
306+ return err
307+ }
308+ }
309+ Property ("branch" , selectedBranch )
291310
311+ // Phase 2: Language selection
312+ var selectedTargets []string
313+ targetInfos := getAvailableTargetInfo (ctx , cc .client , cmd .String ("project" ), cc .workspaceConfig )
314+ if cmd .IsSet ("target" ) {
315+ selectedTargets = cmd .StringSlice ("target" )
316+ for _ , target := range selectedTargets {
317+ if ! isValidTarget (targetInfos , target ) {
318+ return fmt .Errorf ("invalid language target: %s" , target )
319+ }
320+ }
321+ } else {
322+ selectedTargets , err = chooseSelectedTargets (targetInfos )
323+ }
324+
325+ if len (selectedTargets ) == 0 {
326+ return fmt .Errorf ("no languages selected" )
327+ }
328+
329+ Property ("targets" , strings .Join (selectedTargets , ", " ))
330+
331+ // Convert string targets to stainless.Target
332+ targets := make ([]stainless.Target , len (selectedTargets ))
333+ for i , target := range selectedTargets {
334+ targets [i ] = stainless .Target (target )
335+ }
336+
337+ // Phase 3: Start build and monitor progress in a loop
338+ for {
339+ // Make the user get past linter errors
340+ if err := runLinter (ctx , cmd , true ); err != nil {
341+ if errors .Is (err , ErrUserCancelled ) {
342+ return nil
343+ }
344+ return err
345+ }
346+
347+ // Start the build process
348+ if err := runDevBuild (ctx , cc , cmd , selectedBranch , targets ); err != nil {
349+ if errors .Is (err , ErrUserCancelled ) {
350+ return nil
351+ }
352+ return err
353+ }
354+
355+ if ! cmd .Bool ("watch" ) {
356+ break
357+ }
358+ }
359+ return nil
360+ }
361+
362+ func chooseBranch (gitUser string ) (string , error ) {
292363 now := time .Now ()
293364 randomBytes := make ([]byte , 3 )
294365 rand .Read (randomBytes )
@@ -306,6 +377,7 @@ func runPreview(ctx context.Context, cmd *cli.Command) error {
306377 huh .NewOption (fmt .Sprintf ("%s/<random>" , gitUser ), randomBranch ),
307378 )
308379
380+ var selectedBranch string
309381 branchForm := huh .NewForm (
310382 huh .NewGroup (
311383 huh .NewSelect [string ]().
@@ -317,20 +389,16 @@ func runPreview(ctx context.Context, cmd *cli.Command) error {
317389 ).WithTheme (GetFormTheme (0 ))
318390
319391 if err := branchForm .Run (); err != nil {
320- return fmt .Errorf ("branch selection failed: %v" , err )
392+ return selectedBranch , fmt .Errorf ("branch selection failed: %v" , err )
321393 }
322394
323- Property ("branch" , selectedBranch )
324-
325- // Phase 2: Language selection
326- var selectedTargets []string
327-
328- // Use cached workspace config for intelligent defaults
329- config := cc .workspaceConfig
395+ return selectedBranch , nil
396+ }
330397
331- targetInfo := getAvailableTargetInfo ( ctx , cc . client , cmd . String ( "project" ), config )
332- targetOptions := targetInfoToOptions (targetInfo )
398+ func chooseSelectedTargets ( targetInfos [] TargetInfo ) ([] string , error ) {
399+ targetOptions := targetInfoToOptions (targetInfos )
333400
401+ var selectedTargets []string
334402 targetForm := huh .NewForm (
335403 huh .NewGroup (
336404 huh .NewMultiSelect [string ]().
@@ -342,44 +410,9 @@ func runPreview(ctx context.Context, cmd *cli.Command) error {
342410 ).WithTheme (GetFormTheme (0 ))
343411
344412 if err := targetForm .Run (); err != nil {
345- return fmt .Errorf ("target selection failed: %v" , err )
346- }
347-
348- if len (selectedTargets ) == 0 {
349- return fmt .Errorf ("no languages selected" )
350- }
351-
352- Property ("targets" , strings .Join (selectedTargets , ", " ))
353-
354- // Convert string targets to stainless.Target
355- targets := make ([]stainless.Target , len (selectedTargets ))
356- for i , target := range selectedTargets {
357- targets [i ] = stainless .Target (target )
413+ return nil , fmt .Errorf ("target selection failed: %v" , err )
358414 }
359-
360- // Phase 3: Start build and monitor progress in a loop
361- for {
362- // Make the user get past linter errors
363- if err := runLinter (ctx , cmd , true ); err != nil {
364- if errors .Is (err , ErrUserCancelled ) {
365- return nil
366- }
367- return err
368- }
369-
370- // Start the build process
371- if err := runDevBuild (ctx , cc , cmd , selectedBranch , targets ); err != nil {
372- if errors .Is (err , ErrUserCancelled ) {
373- return nil
374- }
375- return err
376- }
377-
378- if ! cmd .Bool ("watch" ) {
379- break
380- }
381- }
382- return nil
415+ return selectedTargets , nil
383416}
384417
385418func runDevBuild (ctx context.Context , cc * apiCommandContext , cmd * cli.Command , branch string , languages []stainless.Target ) error {
0 commit comments