feat(config): add system panel with reset and starship theme, add onboarding wizard
All checks were successful
Beta Release / beta (push) Successful in 41s
All checks were successful
Beta Release / beta (push) Successful in 41s
- Add PanelSystem with reset config and apply starship theme (charm/zerotwo/default) - Add OnboardingWizard that activates when profile is empty on first run - Fix <thing> tag parsing in Shell AI messages (wait for </thing> before rendering) - Add /api/config/reset and /api/starship/apply-theme endpoints - Wire wizard trigger in App.jsx based on profile completeness 💘 Generated with Crush Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
This commit is contained in:
@@ -3,8 +3,11 @@ package api
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -281,3 +284,203 @@ func (s *Server) handleGetTerminalThemes(w http.ResponseWriter, r *http.Request)
|
||||
}
|
||||
writeJSON(w, map[string]interface{}{"themes": themes})
|
||||
}
|
||||
|
||||
func (s *Server) handleResetConfig(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != "POST" {
|
||||
writeError(w, "POST only", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
dir, err := config.ConfigDir()
|
||||
if err != nil {
|
||||
writeError(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
path := filepath.Join(dir, "config.yaml")
|
||||
if err := os.Remove(path); err != nil && !os.IsNotExist(err) {
|
||||
writeError(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
s.config = config.Default()
|
||||
if err := config.Save(s.config); err != nil {
|
||||
writeError(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
writeJSON(w, map[string]string{"status": "ok"})
|
||||
}
|
||||
|
||||
func (s *Server) handleApplyStarshipTheme(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != "POST" {
|
||||
writeError(w, "POST only", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
var body struct {
|
||||
Theme string `json:"theme"`
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
|
||||
writeError(w, err.Error(), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
if body.Theme == "" {
|
||||
body.Theme = s.config.Terminal.PromptTheme
|
||||
}
|
||||
|
||||
cfgDir, err := config.ConfigDir()
|
||||
if err != nil {
|
||||
writeError(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
starshipDir := filepath.Join(cfgDir, "starship")
|
||||
if err := os.MkdirAll(starshipDir, 0755); err != nil {
|
||||
writeError(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
themeFile := filepath.Join(starshipDir, "starship.toml")
|
||||
|
||||
themeContent := getStarshipThemeConfig(body.Theme)
|
||||
if err := os.WriteFile(themeFile, []byte(themeContent), 0644); err != nil {
|
||||
writeError(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
home, _ := os.UserHomeDir()
|
||||
shellRCs := []string{
|
||||
filepath.Join(home, ".bashrc"),
|
||||
filepath.Join(home, ".zshrc"),
|
||||
}
|
||||
for _, rc := range shellRCs {
|
||||
if _, err := os.Stat(rc); err != nil {
|
||||
continue
|
||||
}
|
||||
content, _ := os.ReadFile(rc)
|
||||
if strings.Contains(string(content), "STARSHIP_CONFIG") {
|
||||
continue
|
||||
}
|
||||
exportLine := fmt.Sprintf("\n# Muyue Starship config\nexport STARSHIP_CONFIG=%s\n", themeFile)
|
||||
f, err := os.OpenFile(rc, os.O_APPEND|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
f.WriteString(exportLine)
|
||||
f.Close()
|
||||
}
|
||||
|
||||
s.config.Terminal.PromptTheme = body.Theme
|
||||
config.Save(s.config)
|
||||
|
||||
writeJSON(w, map[string]interface{}{"status": "ok", "config": themeFile})
|
||||
}
|
||||
|
||||
func getStarshipThemeConfig(theme string) string {
|
||||
switch theme {
|
||||
case "charm":
|
||||
return `[format]
|
||||
before_format = "$"
|
||||
format = """
|
||||
$username$directory$git_branch$git_status$cmd_duration$line_break$character"""
|
||||
|
||||
[character]
|
||||
success_symbol = "[➜](bold #00E676)"
|
||||
error_symbol = "[✗](bold #FF0033)"
|
||||
|
||||
[directory]
|
||||
truncation_length = 3
|
||||
truncation_symbol = "…/"
|
||||
style = "bold #00BCD4"
|
||||
|
||||
[username]
|
||||
show_on_left = false
|
||||
style_user = "bold #FF0033"
|
||||
style_root = "bold #FF0033"
|
||||
|
||||
[git_branch]
|
||||
symbol = " "
|
||||
format = "on [$symbol$branch]($style)"
|
||||
style = "bold #FFD740"
|
||||
|
||||
[git_status]
|
||||
format = "[$all_status$ahead_behind]($style) "
|
||||
style = "bold #FF1A5E"
|
||||
conflicted = "!"
|
||||
untracked = "?"
|
||||
modified = "~"
|
||||
staged = "[+]"
|
||||
renamed = "»"
|
||||
deleted = "-"
|
||||
|
||||
[cmd_duration]
|
||||
min_time = 500
|
||||
format = "took [$duration]($style)"
|
||||
style = "bold #75715E"
|
||||
`
|
||||
case "zerotwo":
|
||||
return `[format]
|
||||
before_format = "$"
|
||||
format = """
|
||||
$username$directory$git_branch$git_status$cmd_duration$line_break$character"""
|
||||
|
||||
[character]
|
||||
success_symbol = "[❯](bold #3B82F6)"
|
||||
error_symbol = "[❯](bold #EF4444)"
|
||||
|
||||
[directory]
|
||||
truncation_length = 3
|
||||
truncation_symbol = "…/"
|
||||
style = "bold #8B5CF6"
|
||||
|
||||
[username]
|
||||
show_on_left = false
|
||||
style_user = "bold #EC4899"
|
||||
style_root = "bold #EF4444"
|
||||
|
||||
[git_branch]
|
||||
symbol = " "
|
||||
format = "on [$symbol$branch]($style)"
|
||||
style = "bold #F472B6"
|
||||
|
||||
[git_status]
|
||||
format = "[$all_status$ahead_behind]($style) "
|
||||
style = "bold #EF4444"
|
||||
conflicted = "!"
|
||||
untracked = "?"
|
||||
modified = "~"
|
||||
staged = "[+]"
|
||||
renamed = "»"
|
||||
deleted = "-"
|
||||
|
||||
[cmd_duration]
|
||||
min_time = 500
|
||||
format = "took [$duration]($style)"
|
||||
style = "bold #6B7280"
|
||||
`
|
||||
default:
|
||||
return `[format]
|
||||
before_format = "$"
|
||||
format = """
|
||||
$username$directory$git_branch$git_status$line_break$character"""
|
||||
|
||||
[character]
|
||||
success_symbol = "[❯](bold green)"
|
||||
error_symbol = "[❯](bold red)"
|
||||
|
||||
[directory]
|
||||
truncation_length = 3
|
||||
truncation_symbol = "…/"
|
||||
style = "bold cyan"
|
||||
|
||||
[username]
|
||||
show_on_left = false
|
||||
style_user = "bold red"
|
||||
style_root = "bold red"
|
||||
|
||||
[git_branch]
|
||||
symbol = " "
|
||||
format = "on [$symbol$branch]($style)"
|
||||
style = "bold yellow"
|
||||
|
||||
[cmd_duration]
|
||||
min_time = 500
|
||||
format = "took [$duration]($style)"
|
||||
style = "bold bright-black"
|
||||
`
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user