@@ -5,18 +5,29 @@ import (
55 "fmt"
66 "log/slog"
77 "os"
8+ "os/exec"
9+ "path/filepath"
10+ "runtime"
811 "runtime/debug"
12+ "strings"
913
1014 tea "github.com/charmbracelet/bubbletea"
15+ "github.com/tailscale/aperture-cli/internal/config"
1116 "github.com/tailscale/aperture-cli/internal/profiles"
1217 "github.com/tailscale/aperture-cli/internal/tui"
18+
19+ // Side-effect imports register each client with internal/clients.
20+ _ "github.com/tailscale/aperture-cli/internal/clients/claudecode"
21+ _ "github.com/tailscale/aperture-cli/internal/clients/codex"
22+ _ "github.com/tailscale/aperture-cli/internal/clients/gemini"
23+ _ "github.com/tailscale/aperture-cli/internal/clients/opencode"
1324)
1425
1526var (
1627 flagVersion = flag .Bool ("version" , false , "print version and exit" )
1728 flagDebug = flag .Bool ("debug" , false , "print env vars set before launching agent" )
1829
19- buildVersion = "v0.0.0 -dev"
30+ buildVersion = "B0 -dev"
2031 buildCommit = "unknown"
2132 buildDate = "unknown"
2233)
@@ -27,8 +38,12 @@ func init() {
2738 return
2839 }
2940
30- if buildVersion == "v0.0.0-dev" && info .Main .Version != "" && info .Main .Version != "(devel)" {
31- buildVersion = info .Main .Version
41+ if buildVersion == "B0-dev" {
42+ if height := gitCommitHeight (); height != "" {
43+ buildVersion = "B" + height
44+ } else if info .Main .Version != "" && info .Main .Version != "(devel)" {
45+ buildVersion = info .Main .Version
46+ }
3247 }
3348
3449 // Only fill in VCS info when ldflags haven't already set these values.
@@ -56,6 +71,41 @@ func init() {
5671 }
5772}
5873
74+ func gitCommitHeight () string {
75+ _ , file , _ , ok := runtime .Caller (0 )
76+ if ! ok {
77+ return ""
78+ }
79+ for dir := filepath .Dir (file ); ; dir = filepath .Dir (dir ) {
80+ if _ , err := os .Stat (filepath .Join (dir , ".git" )); err == nil {
81+ return gitCommitHeightInDir (dir )
82+ }
83+ parent := filepath .Dir (dir )
84+ if parent == dir {
85+ return ""
86+ }
87+ }
88+ }
89+
90+ func gitCommitHeightInDir (dir string ) string {
91+ cmd := exec .Command ("git" , "rev-list" , "--count" , "HEAD" )
92+ cmd .Dir = dir
93+ out , err := cmd .Output ()
94+ if err != nil {
95+ return ""
96+ }
97+ height := strings .TrimSpace (string (out ))
98+ if height == "" {
99+ return ""
100+ }
101+ for _ , r := range height {
102+ if r < '0' || r > '9' {
103+ return ""
104+ }
105+ }
106+ return height
107+ }
108+
59109func main () {
60110 flag .Parse ()
61111
@@ -68,16 +118,17 @@ func main() {
68118 os .Exit (0 )
69119 }
70120
71- settings , _ := profiles .LoadSettings ()
72- state , _ := profiles .LoadState ()
73-
74- // Use the first saved endpoint as the active host; fall back to the default.
75- host := "http://ai"
76- if len (settings .Endpoints ) > 0 {
77- host = settings .Endpoints [0 ].URL
121+ g , err := config .Load ()
122+ if err != nil {
123+ slog .Error ("loading launcher config" , "err" , err )
124+ os .Exit (1 )
78125 }
126+ g .Debug = * flagDebug
127+
128+ // Register Claude Desktop on supported platforms (darwin, windows).
129+ profiles .RegisterIfSupported ()
79130
80- p := tea .NewProgram (tui .NewModel (host , settings , state , * flagDebug ))
131+ p := tea .NewProgram (tui .NewModel (g , buildVersion ))
81132 if _ , err := p .Run (); err != nil {
82133 slog .Error ("launcher error" , "err" , err )
83134 os .Exit (1 )
0 commit comments