- Update start command to check if the current directory is a Yao app root or a subdirectory, providing clearer error messages for users. - Modify installation logic to handle empty directories more effectively, ensuring the init app is installed only when appropriate. - Improve welcome message formatting and update links for documentation and community resources. Co-authored-by: Cursor <cursoragent@cursor.com>
115 lines
4 KiB
Go
115 lines
4 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/fatih/color"
|
|
"github.com/spf13/cobra"
|
|
"github.com/yaoapp/yao/config"
|
|
"github.com/yaoapp/yao/engine"
|
|
"github.com/yaoapp/yao/setup"
|
|
"github.com/yaoapp/yao/share"
|
|
)
|
|
|
|
var initCmd = &cobra.Command{
|
|
Use: "init",
|
|
Short: L("Initialize project"),
|
|
Long: L("Initialize a new Yao application in the current directory"),
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
Boot()
|
|
|
|
// First check if we're inside an existing Yao app (including parent directories)
|
|
if setup.InYaoApp(config.Conf.Root) {
|
|
fmt.Println(color.YellowString(L("Directory is inside an existing Yao application")))
|
|
fmt.Println(color.WhiteString("Please run 'yao init' outside of any Yao project"))
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Check if this is an empty directory
|
|
if !setup.IsEmptyDir(config.Conf.Root) {
|
|
// Directory is not empty
|
|
fmt.Println(color.RedString(L("Directory is not empty")))
|
|
fmt.Println(color.WhiteString("Please run 'yao init' in an empty directory"))
|
|
os.Exit(1)
|
|
}
|
|
|
|
startTime := time.Now()
|
|
fmt.Println(color.CyanString("Initializing Yao application..."))
|
|
|
|
// Install the init app (copy embedded files)
|
|
if err := setup.Install(config.Conf.Root); err != nil {
|
|
fmt.Println(color.RedString(L("Install: %s"), err.Error()))
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf(" %s %s\n", color.GreenString("✓"), "Copied application files")
|
|
|
|
// Reload configuration after install
|
|
Boot()
|
|
|
|
// Load the application engine
|
|
loadWarnings, err := engine.Load(config.Conf, engine.LoadOption{Action: "init"})
|
|
if err != nil {
|
|
fmt.Println(color.RedString(L("Load: %s"), err.Error()))
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf(" %s %s\n", color.GreenString("✓"), "Loaded application engine")
|
|
|
|
// Initialize (migrate + setup hook)
|
|
if err := setup.Initialize(config.Conf.Root, config.Conf); err != nil {
|
|
fmt.Println(color.RedString(L("Initialize: %s"), err.Error()))
|
|
os.Exit(1)
|
|
}
|
|
fmt.Printf(" %s %s\n", color.GreenString("✓"), "Initialized database and data")
|
|
|
|
initDuration := time.Since(startTime)
|
|
|
|
// Print warnings if any
|
|
if len(loadWarnings) > 0 {
|
|
fmt.Println(color.YellowString("\n---------------------------------"))
|
|
fmt.Println(color.YellowString(L("Warnings")))
|
|
fmt.Println(color.YellowString("---------------------------------"))
|
|
for _, warning := range loadWarnings {
|
|
fmt.Println(color.YellowString("[%s] %s", warning.Widget, warning.Error))
|
|
}
|
|
}
|
|
|
|
// Print success message
|
|
fmt.Printf("\n%s Application initialized successfully in %s\n\n",
|
|
color.GreenString("✓"),
|
|
color.CyanString("%v", initDuration))
|
|
|
|
// Print application info
|
|
root, _ := filepath.Abs(config.Conf.Root)
|
|
fmt.Println(color.WhiteString("---------------------------------"))
|
|
fmt.Println(color.WhiteString(L("Application Info")))
|
|
fmt.Println(color.WhiteString("---------------------------------"))
|
|
fmt.Println(color.WhiteString(L("Name")), color.GreenString(" %s", share.App.Name))
|
|
fmt.Println(color.WhiteString(L("Version")), color.GreenString(" %s", share.App.Version))
|
|
fmt.Println(color.WhiteString(L("Root")), color.GreenString(" %s", root))
|
|
|
|
// Print welcome message
|
|
printInitWelcome()
|
|
},
|
|
}
|
|
|
|
func printInitWelcome() {
|
|
fmt.Println(color.CyanString("\n---------------------------------"))
|
|
fmt.Println(color.CyanString(L("🎉 Application Ready 🎉")))
|
|
fmt.Println(color.CyanString("---------------------------------"))
|
|
fmt.Println(color.WhiteString("📚 Documentation: "), color.CyanString("https://yaoapps.com/docs"))
|
|
fmt.Println(color.WhiteString("🏡 Join Yao Community: "), color.CyanString("https://yaoapps.com/community"))
|
|
fmt.Println(color.WhiteString("🤖 Build Your Digital Workforce:"), color.CyanString("https://yaoagents.com"))
|
|
fmt.Println("")
|
|
fmt.Println(color.WhiteString(L("NEXT:")))
|
|
fmt.Println(color.GreenString(" 1. Edit .env to configure your application"))
|
|
fmt.Println(color.GreenString(" 2. Run 'yao start' to start the server"))
|
|
fmt.Println("")
|
|
}
|
|
|
|
func init() {
|
|
// Register init command
|
|
rootCmd.AddCommand(initCmd)
|
|
}
|