Skip to content

Commit 348d31b

Browse files
committed
feat: add install subcommand with positional username argument
1 parent 1716636 commit 348d31b

2 files changed

Lines changed: 77 additions & 0 deletions

File tree

internal/cli/install.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package cli
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/openbootdotdev/openboot/internal/auth"
7+
"github.com/openbootdotdev/openboot/internal/config"
8+
"github.com/openbootdotdev/openboot/internal/installer"
9+
"github.com/openbootdotdev/openboot/internal/updater"
10+
"github.com/spf13/cobra"
11+
)
12+
13+
var installCmd = &cobra.Command{
14+
Use: "install [username]",
15+
Short: "Set up your Mac dev environment",
16+
Long: `Install and configure your Mac development environment.
17+
18+
You can provide a username to install from that user's openboot.dev config,
19+
or run it interactively without arguments.`,
20+
Example: ` # Interactive setup with package selection
21+
openboot install
22+
23+
# Install from a user's cloud config
24+
openboot install githubusername
25+
26+
# Quick setup with a preset
27+
openboot install -p developer
28+
29+
# Preview changes without installing
30+
openboot install --dry-run`,
31+
Args: cobra.MaximumNArgs(1),
32+
RunE: func(cmd *cobra.Command, args []string) error {
33+
if len(args) > 0 && cfg.User == "" {
34+
cfg.User = args[0]
35+
36+
var token string
37+
if stored, err := auth.LoadToken(); err == nil && stored != nil {
38+
token = stored.Token
39+
}
40+
rc, err := config.FetchRemoteConfig(cfg.User, token)
41+
if err != nil {
42+
return fmt.Errorf("error fetching remote config: %v", err)
43+
}
44+
cfg.RemoteConfig = rc
45+
if cfg.Preset == "" {
46+
cfg.Preset = rc.Preset
47+
}
48+
}
49+
50+
updater.AutoUpgrade(version)
51+
cfg.Version = version
52+
err := installer.Run(cfg)
53+
if err == installer.ErrUserCancelled {
54+
return nil
55+
}
56+
return err
57+
},
58+
}
59+
60+
func init() {
61+
installCmd.Flags().SortFlags = false
62+
63+
installCmd.Flags().StringVarP(&cfg.Preset, "preset", "p", "", "use a preset: minimal, developer, full")
64+
installCmd.Flags().StringVarP(&cfg.User, "user", "u", "", "install from openboot.dev/username config")
65+
installCmd.Flags().BoolVarP(&cfg.Silent, "silent", "s", false, "non-interactive mode (for CI/CD)")
66+
installCmd.Flags().BoolVar(&cfg.DryRun, "dry-run", false, "preview changes without installing")
67+
installCmd.Flags().BoolVar(&cfg.Resume, "resume", false, "resume an incomplete installation")
68+
installCmd.Flags().BoolVar(&cfg.PackagesOnly, "packages-only", false, "install packages only, skip system config")
69+
70+
installCmd.Flags().StringVar(&cfg.Shell, "shell", "", "shell setup: install, skip")
71+
installCmd.Flags().StringVar(&cfg.Macos, "macos", "", "macOS preferences: configure, skip")
72+
installCmd.Flags().StringVar(&cfg.Dotfiles, "dotfiles", "", "dotfiles: clone, link, skip")
73+
74+
installCmd.Flags().BoolVar(&cfg.Update, "update", false, "update Homebrew before installing")
75+
installCmd.Flags().BoolVar(&cfg.Rollback, "rollback", false, "restore backed-up config files")
76+
}

internal/cli/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ func init() {
9898
rootCmd.Flags().BoolVar(&cfg.Update, "update", false, "update Homebrew before installing")
9999
rootCmd.Flags().BoolVar(&cfg.Rollback, "rollback", false, "restore backed-up config files")
100100

101+
rootCmd.AddCommand(installCmd)
101102
rootCmd.AddCommand(versionCmd)
102103
rootCmd.AddCommand(updateCmd)
103104
rootCmd.AddCommand(doctorCmd)

0 commit comments

Comments
 (0)