Major changes: - Refactor CLI entry point to Cobra commands (root, setup, scan, doctor, install, update, lsp, mcp, skills, config, version) - Add LSP registry with health checks, auto-install, and editor config generation - Add MCP registry with editor detection, status tracking, and per-editor configuration - Add workflow engine with planner and step execution for automated task chains - Add conversation search, export (Markdown/JSON), and detailed token counting - Add streaming shell chat handler with tool call/result events - Add skill validation, dry-run testing, and export endpoints - Enrich dashboard with Tools/Activity/Status tabs and tool cards grid - Add PRD documentation - Complete i18n for both EN and FR 💘 Generated with Crush Assisted-by: GLM-5.1 via Crush <crush@charm.land>
80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package commands
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/muyue/muyue/internal/scanner"
|
|
"github.com/muyue/muyue/internal/updater"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var updateCmd = &cobra.Command{
|
|
Use: "update [tool]",
|
|
Short: "Check and apply updates",
|
|
Args: cobra.RangeArgs(0, 1),
|
|
RunE: runUpdate,
|
|
}
|
|
|
|
var checkOnly bool
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(updateCmd)
|
|
updateCmd.Flags().BoolVar(&checkOnly, "check", false, "Check only, don't update")
|
|
}
|
|
|
|
func runUpdate(cmd *cobra.Command, args []string) error {
|
|
result := scanner.ScanSystem()
|
|
statuses := updater.CheckUpdates(result)
|
|
|
|
if len(args) > 0 {
|
|
for _, u := range statuses {
|
|
if u.Tool == args[0] {
|
|
if u.NeedsUpdate {
|
|
fmt.Printf("%s: %s → %s\n", u.Tool, u.Current, u.Latest)
|
|
if !checkOnly {
|
|
updater.RunAutoUpdate([]updater.UpdateStatus{u})
|
|
fmt.Println("Updated!")
|
|
}
|
|
} else {
|
|
fmt.Printf("%s is up to date (%s)\n", u.Tool, u.Current)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
fmt.Printf("Tool '%s' not found\n", args[0])
|
|
return nil
|
|
}
|
|
|
|
fmt.Printf("%-15s %-10s %-10s %-10s\n", "Tool", "Current", "Latest", "Status")
|
|
fmt.Println("─────────────────────────────────────────")
|
|
hasUpdates := false
|
|
for _, u := range statuses {
|
|
status := "✓"
|
|
if u.NeedsUpdate {
|
|
status = "⟳ update"
|
|
hasUpdates = true
|
|
}
|
|
if u.Error != "" {
|
|
status = "✗ " + u.Error
|
|
}
|
|
fmt.Printf("%-15s %-10s %-10s %-10s\n", u.Tool, u.Current, u.Latest, status)
|
|
}
|
|
|
|
if checkOnly {
|
|
return nil
|
|
}
|
|
|
|
if hasUpdates {
|
|
toUpdate := make([]updater.UpdateStatus, 0)
|
|
for _, u := range statuses {
|
|
if u.NeedsUpdate {
|
|
toUpdate = append(toUpdate, u)
|
|
}
|
|
}
|
|
updater.RunAutoUpdate(toUpdate)
|
|
fmt.Println("\nUpdates applied.")
|
|
} else {
|
|
fmt.Println("\nAll tools are up to date.")
|
|
}
|
|
return nil
|
|
} |