@@ -17,12 +17,16 @@ package project
1717import (
1818 "context"
1919 "fmt"
20+ "math/rand"
2021 "path/filepath"
2122 "strings"
23+ "time"
2224
25+ "github.com/slackapi/slack-cli/internal/iostreams"
2326 "github.com/slackapi/slack-cli/internal/logger"
2427 "github.com/slackapi/slack-cli/internal/pkg/create"
2528 "github.com/slackapi/slack-cli/internal/shared"
29+ "github.com/slackapi/slack-cli/internal/slackerror"
2630 "github.com/slackapi/slack-cli/internal/slacktrace"
2731 "github.com/slackapi/slack-cli/internal/style"
2832 "github.com/spf13/cobra"
@@ -33,6 +37,7 @@ var createTemplateURLFlag string
3337var createGitBranchFlag string
3438var createAppNameFlag string
3539var createListFlag bool
40+ var createSubdirFlag string
3641
3742// Handle to client's create function used for testing
3843// TODO - Find best practice, such as using an Interface and Struct to create a client
@@ -66,6 +71,7 @@ name your app 'agent' (not create an AI Agent), use the --name flag instead.`,
6671 {Command : "create agent my-agent-app" , Meaning : "Create a new AI Agent app" },
6772 {Command : "create my-project -t slack-samples/deno-hello-world" , Meaning : "Start a new project from a specific template" },
6873 {Command : "create --name my-project" , Meaning : "Create a project named 'my-project'" },
74+ {Command : "create my-project -t org/monorepo --subdir apps/my-app" , Meaning : "Create from a subdirectory of a template" },
6975 }),
7076 Args : cobra .MaximumNArgs (2 ),
7177 RunE : func (cmd * cobra.Command , args []string ) error {
@@ -79,6 +85,7 @@ name your app 'agent' (not create an AI Agent), use the --name flag instead.`,
7985 cmd .Flags ().StringVarP (& createGitBranchFlag , "branch" , "b" , "" , "name of git branch to checkout" )
8086 cmd .Flags ().StringVarP (& createAppNameFlag , "name" , "n" , "" , "name for your app (overrides the name argument)" )
8187 cmd .Flags ().BoolVar (& createListFlag , "list" , false , "list available app templates" )
88+ cmd .Flags ().StringVar (& createSubdirFlag , "subdir" , "" , "subdirectory in the template to use as project" )
8289
8390 return cmd
8491}
@@ -128,19 +135,45 @@ func runCreateCommand(clients *shared.ClientFactory, cmd *cobra.Command, args []
128135 return listTemplates (ctx , clients , categoryShortcut )
129136 }
130137
138+ // --subdir requires --template
139+ if cmd .Flags ().Changed ("subdir" ) && ! templateFlagProvided {
140+ return slackerror .New (slackerror .ErrMismatchedFlags ).
141+ WithMessage ("The --subdir flag requires the --template flag" )
142+ }
143+
131144 // Collect the template URL or select a starting template
132145 template , err := promptTemplateSelection (cmd , clients , categoryShortcut )
133146 if err != nil {
134147 return err
135148 }
136149
150+ // Prompt for app name if not provided via flag or argument
151+ if appNameArg == "" {
152+ if clients .IO .IsTTY () {
153+ defaultName := generateRandomAppName ()
154+ cmd .Print (style .Secondary (fmt .Sprintf (" Press Enter to use the generated name: %s" , defaultName )), "\n " )
155+ name , err := clients .IO .InputPrompt (ctx , "Name your app:" , iostreams.InputPromptConfig {})
156+ if err != nil {
157+ return err
158+ }
159+ if name != "" {
160+ appNameArg = name
161+ } else {
162+ appNameArg = defaultName
163+ }
164+ } else {
165+ appNameArg = generateRandomAppName ()
166+ }
167+ }
168+
137169 // Set up spinners
138170 appCreateSpinner = style .NewSpinner (cmd .OutOrStdout ())
139171
140172 createArgs := create.CreateArgs {
141173 AppName : appNameArg ,
142174 Template : template ,
143175 GitBranch : createGitBranchFlag ,
176+ Subdir : createSubdirFlag ,
144177 }
145178 clients .EventTracker .SetAppTemplate (template .GetTemplatePath ())
146179
@@ -277,6 +310,15 @@ func printCreateSuccess(ctx context.Context, clients *shared.ClientFactory, appP
277310 clients .IO .PrintTrace (ctx , slacktrace .CreateSuccess )
278311}
279312
313+ // generateRandomAppName will create a random app name based on two words and a number
314+ func generateRandomAppName () string {
315+ rand .New (rand .NewSource (time .Now ().UnixNano ()))
316+ var firstRandomNum = rand .Intn (len (create .Adjectives ))
317+ var secondRandomNum = rand .Intn (len (create .Animals ))
318+ var randomName = fmt .Sprintf ("%s-%s-%d" , create .Adjectives [firstRandomNum ], create .Animals [secondRandomNum ], rand .Intn (1000 ))
319+ return randomName
320+ }
321+
280322// printAppCreateError stops the creation spinners and displays the returned error message
281323func printAppCreateError (clients * shared.ClientFactory , cmd * cobra.Command , err error ) {
282324 ctx := cmd .Context ()
0 commit comments