Skip to content

Commit 3e450f0

Browse files
committed
address codex review
1 parent 1c0b7b3 commit 3e450f0

3 files changed

Lines changed: 19 additions & 31 deletions

File tree

pkg/analytics/posthog.go

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ func getClient() (posthog.Client, error) {
4848
return client, clientErr
4949
}
5050

51-
// IsAnalyticsFeatureEnabled checks the PostHog feature flag that acts as a
52-
// remote kill switch for CLI telemetry. Lets us globally disable capture
53-
// without shipping a CLI release.
51+
// IsAnalyticsFeatureEnabled is the remote kill switch for CLI telemetry; gating capture lets us turn it off without a release.
5452
func IsAnalyticsFeatureEnabled() bool {
5553
anonID := GetOrCreateAnalyticsID()
5654
if anonID == "" {
@@ -82,11 +80,9 @@ func RecordCommandStart(cmd *cobra.Command, args []string) {
8280
storedArgs = args
8381
}
8482

85-
// IsAnalyticsEnabled returns whether analytics capture is currently enabled.
86-
// Default is on (opt-out model). Honors DO_NOT_TRACK and BREV_NO_ANALYTICS env
87-
// vars as a kill switch for CI / scripted use.
83+
// IsAnalyticsEnabled defaults to true; DO_NOT_TRACK and BREV_NO_ANALYTICS override.
8884
func IsAnalyticsEnabled() bool {
89-
if os.Getenv("DO_NOT_TRACK") == "1" || os.Getenv("BREV_NO_ANALYTICS") == "1" {
85+
if disabled, _ := IsDisabledByEnv(); disabled {
9086
return false
9187
}
9288
settings := readSettings()
@@ -96,8 +92,6 @@ func IsAnalyticsEnabled() bool {
9692
return *settings.AnalyticsEnabled
9793
}
9894

99-
// IsDisabledByEnv reports whether analytics is currently disabled by an
100-
// environment-variable kill switch (vs. the user's persisted preference).
10195
func IsDisabledByEnv() (disabled bool, varName string) {
10296
if os.Getenv("DO_NOT_TRACK") == "1" {
10397
return true, "DO_NOT_TRACK"
@@ -108,13 +102,6 @@ func IsDisabledByEnv() (disabled bool, varName string) {
108102
return false, ""
109103
}
110104

111-
// IsAnalyticsExplicitlySet reports whether the user has explicitly chosen a
112-
// preference (true/false), as opposed to leaving it at the default.
113-
func IsAnalyticsExplicitlySet() bool {
114-
settings := readSettings()
115-
return settings.AnalyticsEnabled != nil
116-
}
117-
118105
// SetAnalyticsPreference persists the user's analytics preference.
119106
func SetAnalyticsPreference(enabled bool) error {
120107
fs := files.AppFs
@@ -202,14 +189,7 @@ func CaptureCommandError() {
202189
if storedCmd == nil {
203190
return
204191
}
205-
// If CaptureCommand already ran (success path), don't double-capture.
206-
// storedUser being set means PersistentPostRunE ran.
207-
// We only get here on error, so PersistentPostRunE didn't run.
208-
userID := storedUser
209-
if userID == "" {
210-
userID = GetOrCreateAnalyticsID()
211-
}
212-
captureEvent(userID, storedCmd, storedArgs, false)
192+
captureEvent(storedUser, storedCmd, storedArgs, false)
213193
}
214194

215195
func captureEvent(userID string, cmd *cobra.Command, args []string, succeeded bool) {
@@ -220,6 +200,11 @@ func captureEvent(userID string, cmd *cobra.Command, args []string, succeeded bo
220200
return
221201
}
222202

203+
// Resolve the analytics ID lazily, only after gates pass — avoids writing a
204+
// persistent UUID to ~/.brev/personal_settings.json for opted-out users.
205+
if userID == "" {
206+
userID = GetOrCreateAnalyticsID()
207+
}
223208
if userID == "" {
224209
return
225210
}

pkg/cmd/analytics/analytics.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
1-
// Package analytics provides the `brev analytics` command for managing usage analytics preferences.
21
package analytics
32

43
import (
54
"github.com/brevdev/brev-cli/pkg/analytics"
5+
"github.com/brevdev/brev-cli/pkg/cmd/cmderrors"
66
breverrors "github.com/brevdev/brev-cli/pkg/errors"
77
"github.com/brevdev/brev-cli/pkg/terminal"
88
"github.com/spf13/cobra"
99
)
1010

11-
// AnalyticsStore is provided for parity with other commands; no store calls are required today.
12-
type AnalyticsStore interface{}
13-
14-
func NewCmdAnalytics(t *terminal.Terminal, _ AnalyticsStore) *cobra.Command {
11+
func NewCmdAnalytics(t *terminal.Terminal) *cobra.Command {
1512
cmd := &cobra.Command{
1613
Annotations: map[string]string{"configuration": ""},
1714
Use: "analytics",
1815
DisableFlagsInUseLine: true,
1916
Short: "Manage usage analytics",
2017
Long: "Show or change whether the Brev CLI sends usage analytics.",
2118
Example: "brev analytics\nbrev analytics on\nbrev analytics off",
19+
Args: cmderrors.TransformToValidationError(cobra.NoArgs),
2220
RunE: func(cmd *cobra.Command, args []string) error {
2321
printStatus(t)
2422
return nil
@@ -36,11 +34,15 @@ func newCmdOn(t *terminal.Terminal) *cobra.Command {
3634
Use: "on",
3735
DisableFlagsInUseLine: true,
3836
Short: "Enable usage analytics",
37+
Args: cmderrors.TransformToValidationError(cobra.NoArgs),
3938
RunE: func(cmd *cobra.Command, args []string) error {
4039
if err := analytics.SetAnalyticsPreference(true); err != nil {
4140
return breverrors.WrapAndTrace(err)
4241
}
4342
t.Vprintf("%s\n", t.Green("Analytics enabled."))
43+
if disabled, varName := analytics.IsDisabledByEnv(); disabled {
44+
t.Vprintf("Note: still disabled at runtime by %s=1.\n", varName)
45+
}
4446
return nil
4547
},
4648
}
@@ -51,6 +53,7 @@ func newCmdOff(t *terminal.Terminal) *cobra.Command {
5153
Use: "off",
5254
DisableFlagsInUseLine: true,
5355
Short: "Disable usage analytics",
56+
Args: cmderrors.TransformToValidationError(cobra.NoArgs),
5457
RunE: func(cmd *cobra.Command, args []string) error {
5558
if err := analytics.SetAnalyticsPreference(false); err != nil {
5659
return breverrors.WrapAndTrace(err)

pkg/cmd/cmd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func NewBrevCommand() *cobra.Command { //nolint:funlen,gocognit,gocyclo // defin
155155
Find more information at:
156156
https://brev.nvidia.com`,
157157
PersistentPostRunE: func(cmd *cobra.Command, args []string) error {
158-
analytics.CaptureCommand(analytics.GetOrCreateAnalyticsID(), cmd, args)
158+
analytics.CaptureCommand("", cmd, args)
159159
return nil
160160
},
161161
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
@@ -321,7 +321,7 @@ func createCmdTree(cmd *cobra.Command, t *terminal.Terminal, loginCmdStore *stor
321321
cmd.AddCommand(open.NewCmdOpen(t, loginCmdStore, noLoginCmdStore))
322322
cmd.AddCommand(ollama.NewCmdOllama(t, loginCmdStore))
323323
cmd.AddCommand(agentskill.NewCmdAgentSkill(t, noLoginCmdStore))
324-
cmd.AddCommand(analyticscmd.NewCmdAnalytics(t, nil))
324+
cmd.AddCommand(analyticscmd.NewCmdAnalytics(t))
325325
cmd.AddCommand(background.NewCmdBackground(t, loginCmdStore))
326326
cmd.AddCommand(status.NewCmdStatus(t, loginCmdStore))
327327
cmd.AddCommand(sshkeys.NewCmdSSHKeys(t, loginCmdStore))

0 commit comments

Comments
 (0)