diff --git a/cmd/bundle.go b/cmd/bundle.go index b852cdd0..0c067a59 100644 --- a/cmd/bundle.go +++ b/cmd/bundle.go @@ -38,6 +38,12 @@ Examples: ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGINT, syscall.SIGTERM) defer cancel() projectContext := project.EnsureProject(ctx, cmd) + + // Check for prompts evals feature flag + if CheckFeatureFlag(cmd, FeaturePromptsEvals, "enable-prompts-evals") { + projectContext.Logger.Info("Prompts evaluations feature is enabled") + } + production, _ := cmd.Flags().GetBool("production") install, _ := cmd.Flags().GetBool("install") deploy, _ := cmd.Flags().GetBool("deploy") diff --git a/cmd/feature_flags.go b/cmd/feature_flags.go new file mode 100644 index 00000000..d6785c92 --- /dev/null +++ b/cmd/feature_flags.go @@ -0,0 +1,67 @@ +package cmd + +import ( + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +// Feature flag constants +const ( + FeaturePromptsEvals = "enable_prompts_evals" +) + +// SetupFeatureFlags initializes feature flag configuration and command line flags +func SetupFeatureFlags(rootCmd *cobra.Command) { + // Add command line flags (no defaults set - only write to config when explicitly enabled) + rootCmd.PersistentFlags().Bool("enable-prompts-evals", false, "Enable prompts evals") + rootCmd.PersistentFlags().MarkHidden("enable-prompts-evals") + // Don't bind to viper - we'll handle this manually to prevent false values in config +} + +// Feature flag helper functions + +// IsFeatureEnabled checks if a feature flag is enabled +func IsFeatureEnabled(feature string) bool { + key := "features." + feature + if viper.IsSet(key) { + return viper.GetBool(key) + } + return false +} + +// CheckFeatureFlag checks if a feature flag is enabled via command line or config +// and only writes to config if explicitly enabled +func CheckFeatureFlag(cmd *cobra.Command, feature string, cmdFlagName string) bool { + // Check if flag was set via command line + if cmd.Flags().Changed(cmdFlagName) { + enabled, _ := cmd.Flags().GetBool(cmdFlagName) + // Only write to config if explicitly enabled + if enabled { + viper.Set("features."+feature, true) + } + return enabled + } + + // Check config file + return IsFeatureEnabled(feature) +} + +// IsExperimentalEnabled checks if experimental features are enabled +func IsPromptsEvalsEnabled() bool { + return IsFeatureEnabled(FeaturePromptsEvals) +} + +// GetEnabledFeatures returns a list of all currently enabled feature flags +func GetEnabledFeatures() []string { + var enabled []string + + if IsPromptsEvalsEnabled() { + enabled = append(enabled, FeaturePromptsEvals) + } + return enabled +} + +// IsAnyFeatureEnabled checks if any feature flags are enabled +func IsAnyFeatureEnabled() bool { + return IsPromptsEvalsEnabled() +} diff --git a/cmd/root.go b/cmd/root.go index 40fe2b3a..434ef00f 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -135,6 +135,9 @@ func init() { viper.SetDefault("overrides.api_url", "https://api.agentuity.com") viper.SetDefault("overrides.transport_url", "https://agentuity.ai") + // Setup feature flags + SetupFeatureFlags(rootCmd) + cobra.OnInitialize(initConfig) } diff --git a/cmd/version.go b/cmd/version.go index 7b9150a7..3744d05c 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -34,6 +34,11 @@ Examples: fmt.Println("Version: " + Version) fmt.Println("Commit: " + Commit) fmt.Println("Date: " + Date) + + // Example of using feature flags + if IsPromptsEvalsEnabled() { + fmt.Println("Prompts Evals: Enabled") + } } else { fmt.Println(Version) }