11package cmd
22
33import (
4- "errors"
54 "fmt"
65 "log/slog"
76 "os"
8- "strings"
97
10- tea "github.com/charmbracelet/bubbletea"
118 "github.com/spf13/cobra"
129 "github.com/spf13/viper"
1310 "github.com/xinnjie/onekeymap-cli/internal/cliconfig"
1411 "github.com/xinnjie/onekeymap-cli/internal/updatecheck"
15- "github.com/xinnjie/onekeymap-cli/internal/views"
1612 "github.com/xinnjie/onekeymap-cli/pkg/api/exporterapi"
1713 "github.com/xinnjie/onekeymap-cli/pkg/api/importerapi"
1814 "github.com/xinnjie/onekeymap-cli/pkg/exporter"
@@ -50,7 +46,6 @@ type rootFlags struct {
5046 logJSON bool
5147 backup bool
5248 interactive bool
53- enableTelemetry bool
5449 sandbox bool
5550 skipUpdateCheck bool
5651 onekeymap string
@@ -77,8 +72,6 @@ func newCmdRoot() (*cobra.Command, *rootFlags) {
7772 cmd .PersistentFlags ().BoolVar (& f .logJSON , "log-json" , false , "Output logs in JSON format" )
7873 cmd .PersistentFlags ().BoolVarP (& f .backup , "backup" , "b" , true , "Create a backup of the target editor's keymap" )
7974 cmd .PersistentFlags ().BoolVarP (& f .interactive , "interactive" , "i" , true , "Run in interactive mode" )
80- cmd .PersistentFlags ().
81- BoolVar (& f .enableTelemetry , "telemetry" , false , "Enable telemetry to help improve onekeymap-cli" )
8275 cmd .PersistentFlags ().
8376 BoolVar (& f .sandbox , "sandbox" , false , "Enable sandbox mode for macOS, restricting file access" )
8477 cmd .PersistentFlags ().
@@ -90,10 +83,6 @@ func newCmdRoot() (*cobra.Command, *rootFlags) {
9083 cmd .PrintErrf ("Error binding onekeymap flag: %v\n " , err )
9184 os .Exit (1 )
9285 }
93- if err := viper .BindPFlag ("telemetry.enabled" , cmd .PersistentFlags ().Lookup ("telemetry" )); err != nil {
94- cmd .PrintErrf ("Error binding telemetry flag: %v\n " , err )
95- os .Exit (1 )
96- }
9786
9887 return cmd , & f
9988}
@@ -106,26 +95,15 @@ func rootPersistentPreRun(f *rootFlags) func(cmd *cobra.Command, _ []string) {
10695 os .Exit (1 )
10796 }
10897
109- // Show telemetry prompt in interactive mode if telemetry is not explicitly configured
110- // and not explicitly enabled via flag, and running in a TTY environment
11198 isTTY := term .IsTerminal (int (os .Stdin .Fd ()))
11299 if ! isTTY {
113100 f .interactive = false
114101 }
115- if f .interactive && isTTY && ! cliconfig .IsTelemetryExplicitlySet () && ! f .enableTelemetry {
116- if err := showTelemetryPrompt (); err != nil {
117- cmd .PrintErrf ("Error showing telemetry prompt: %v\n " , err )
118- // Continue execution even if prompt fails
119- }
120- }
121102
122103 verbose := f .verbose
123104 quiet := f .quiet
124105 logJSON := f .logJSON
125- telemetryEnabled := viper .GetBool ("telemetry.enabled" )
126- telemetryEndpoint := viper .GetString ("telemetry.endpoint" )
127- telemetryHeaders := viper .GetString ("telemetry.headers" )
128- ctx := cmd .Context ()
106+ cmdRecorder = metrics .NewNoop ()
129107
130108 cmdMappingConfig , err = mappings .NewMappingConfig ()
131109 if err != nil {
@@ -165,30 +143,6 @@ func rootPersistentPreRun(f *rootFlags) func(cmd *cobra.Command, _ []string) {
165143 }
166144
167145 cmdLogger = slog .New (handler )
168- logger := cmdLogger
169-
170- cmdRecorder = metrics .NewNoop ()
171- if telemetryEnabled {
172- logger .DebugContext (ctx , "Telemetry enabled" )
173- if telemetryEndpoint == "" {
174- logger .DebugContext (
175- ctx ,
176- "telemetry is enabled, but telemetry.endpoint is not set. Telemetry data will not be sent." ,
177- )
178- }
179-
180- headers := parseHeaders (telemetryHeaders )
181-
182- cmdRecorder , err = metrics .New (ctx , version , logger , metrics.RecorderOption {
183- Endpoint : telemetryEndpoint ,
184- Headers : headers ,
185- UseDelta : true , // Use delta temporality for short-lived CLI application
186- })
187- if err != nil {
188- logger .WarnContext (ctx , "failed to initialize telemetry" , "error" , err )
189- os .Exit (1 )
190- }
191- }
192146
193147 cmdPluginRegistry = registry .NewRegistryWithPlugins (cmdMappingConfig , cmdLogger , cmdRecorder )
194148
@@ -266,56 +220,3 @@ func buildVersionString() string {
266220
267221 return version
268222}
269-
270- const (
271- headerKeyValueParts = 2
272- )
273-
274- // parseHeaders parses a comma-separated string of key=value pairs into a map.
275- // Format: "key1=value1,key2=value2"
276- func parseHeaders (headersStr string ) map [string ]string {
277- if headersStr == "" {
278- return nil
279- }
280-
281- headers := make (map [string ]string )
282- pairs := strings .Split (headersStr , "," )
283- for _ , pair := range pairs {
284- pair = strings .TrimSpace (pair )
285- if pair == "" {
286- continue
287- }
288- parts := strings .SplitN (pair , "=" , headerKeyValueParts )
289- if len (parts ) == headerKeyValueParts {
290- headers [strings .TrimSpace (parts [0 ])] = strings .TrimSpace (parts [1 ])
291- }
292- }
293- return headers
294- }
295-
296- // showTelemetryPrompt displays the telemetry consent prompt and updates config based on user choice
297- func showTelemetryPrompt () error {
298- model := views .NewTelemetryPrompt ()
299- program := tea .NewProgram (model )
300-
301- finalModel , err := program .Run ()
302- if err != nil {
303- return fmt .Errorf ("failed to run telemetry prompt: %w" , err )
304- }
305-
306- // Cast back to our model type
307- m , ok := finalModel .(views.TelemetryPromptModel )
308- if ! ok {
309- return errors .New ("unexpected model type" )
310- }
311-
312- // Only update config if user made a selection (didn't quit)
313- if m .WasSelected () {
314- enabled := m .GetChoice ()
315- if err := cliconfig .UpdateTelemetrySettings (enabled ); err != nil {
316- return fmt .Errorf ("failed to update telemetry settings: %w" , err )
317- }
318- }
319-
320- return nil
321- }
0 commit comments