All checks were successful
Beta Release / beta (push) Successful in 47s
Add /summarize command, token usage bar, and summary endpoint. Add JSON tags to config/platform/scanner structs for API serialization. 💘 Generated with Crush Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
108 lines
2.1 KiB
Go
108 lines
2.1 KiB
Go
package platform
|
|
|
|
import (
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
type OS string
|
|
|
|
const (
|
|
Linux OS = "linux"
|
|
MacOS OS = "darwin"
|
|
Windows OS = "windows"
|
|
Unknown OS = "unknown"
|
|
)
|
|
|
|
type Arch string
|
|
|
|
const (
|
|
AMD64 Arch = "amd64"
|
|
ARM64 Arch = "arm64"
|
|
ARM Arch = "arm"
|
|
X86 Arch = "386"
|
|
)
|
|
|
|
type SystemInfo struct {
|
|
OS OS `json:"os"`
|
|
Arch Arch `json:"arch"`
|
|
IsWSL bool `json:"is_wsl"`
|
|
Shell string `json:"shell"`
|
|
Terminal string `json:"terminal"`
|
|
PackageManager string `json:"package_manager"`
|
|
}
|
|
|
|
func Detect() SystemInfo {
|
|
info := SystemInfo{
|
|
OS: OS(runtime.GOOS),
|
|
Arch: Arch(runtime.GOARCH),
|
|
}
|
|
|
|
info.IsWSL = detectWSL()
|
|
info.Shell = detectShell()
|
|
info.Terminal = detectTerminal()
|
|
info.PackageManager = detectPackageManager(info.OS)
|
|
|
|
return info
|
|
}
|
|
|
|
func detectWSL() bool {
|
|
return fileContains("/proc/version", "microsoft") ||
|
|
fileContains("/proc/version", "WSL")
|
|
}
|
|
|
|
func detectShell() string {
|
|
shells := []string{"zsh", "bash", "fish", "pwsh", "powershell"}
|
|
for _, s := range shells {
|
|
if _, err := execLookPath(s); err == nil {
|
|
return s
|
|
}
|
|
}
|
|
return "sh"
|
|
}
|
|
|
|
func detectTerminal() string {
|
|
terms := []string{
|
|
"hyper", "alacritty", "kitty", "wezterm", "ghostty",
|
|
"windows-terminal", "gnome-terminal", "konsole",
|
|
"xterm", "tilix", "terminator",
|
|
}
|
|
for _, t := range terms {
|
|
if _, err := execLookPath(t); err == nil {
|
|
return t
|
|
}
|
|
}
|
|
return "unknown"
|
|
}
|
|
|
|
func detectPackageManager(os OS) string {
|
|
managers := map[string][]string{
|
|
"linux": {"apt", "dnf", "pacman", "zypper", "nix", "apk", "snap", "flatpak"},
|
|
"darwin": {"brew", "nix"},
|
|
"windows": {"winget", "choco", "scoop"},
|
|
}
|
|
|
|
if list, ok := managers[string(os)]; ok {
|
|
for _, mgr := range list {
|
|
if _, err := execLookPath(mgr); err == nil {
|
|
return mgr
|
|
}
|
|
}
|
|
}
|
|
return "unknown"
|
|
}
|
|
|
|
func (s SystemInfo) String() string {
|
|
parts := []string{
|
|
"OS: " + string(s.OS),
|
|
"Arch: " + string(s.Arch),
|
|
}
|
|
if s.IsWSL {
|
|
parts = append(parts, "WSL: yes")
|
|
}
|
|
parts = append(parts, "Shell: "+s.Shell)
|
|
parts = append(parts, "Terminal: "+s.Terminal)
|
|
parts = append(parts, "PackageManager: "+s.PackageManager)
|
|
return strings.Join(parts, ", ")
|
|
}
|