yao/cmd/init.go
Max 1680d5eefe Refactor Yao app initialization and enhance error handling
- 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>
2026-02-04 19:04:23 +08:00

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)
}