Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 11 additions & 36 deletions cmd/devnet-builder/commands/core/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package core
import (
"encoding/json"
"fmt"
"os"
"path/filepath"

"github.com/altuslabsxyz/devnet-builder/internal/application"
Expand Down Expand Up @@ -98,41 +97,17 @@ func runInit(cmd *cobra.Command, args []string) error {
jsonMode := cfg.JSONMode()

// Build effective config from: default < config.toml < env < flag
// Start with loaded config.toml values
fileCfg := cfg.FileConfig()
if fileCfg == nil {
fileCfg = &config.FileConfig{}
}

// Apply flag values (flags override config.toml)
if cmd.Flags().Changed("network") {
fileCfg.Network = &initNetwork
}
if cmd.Flags().Changed("blockchain") {
fileCfg.BlockchainNetwork = &initBlockchainNetwork
}
if cmd.Flags().Changed("validators") {
fileCfg.Validators = &initValidators
}
if cmd.Flags().Changed("mode") {
em := types.ExecutionMode(initMode)
fileCfg.ExecutionMode = &em
}
if cmd.Flags().Changed("no-cache") {
fileCfg.NoCache = &initNoCache
}
if cmd.Flags().Changed("accounts") {
fileCfg.Accounts = &initAccounts
}

// Apply environment variables (env overrides config.toml but not flags)
if networkEnv := os.Getenv("DEVNET_NETWORK"); networkEnv != "" && !cmd.Flags().Changed("network") {
fileCfg.Network = &networkEnv
}
if modeEnv := os.Getenv("DEVNET_MODE"); modeEnv != "" && !cmd.Flags().Changed("mode") {
mode := types.ExecutionMode(modeEnv)
fileCfg.ExecutionMode = &mode
}
resolver := config.NewResolver()
resolved := resolver.ResolveRuntimeFileConfig(cmd, cfg.FileConfig(), config.RuntimeResolveInput{
Network: initNetwork,
BlockchainNetwork: initBlockchainNetwork,
Validators: initValidators,
Mode: types.ExecutionMode(initMode),
NetworkVersion: initVersion,
NoCache: initNoCache,
Accounts: initAccounts,
})
fileCfg := resolved.FileConfig

// Run partial interactive setup for missing values
setup := config.NewInteractiveSetup(homeDir)
Expand Down
58 changes: 18 additions & 40 deletions cmd/devnet-builder/commands/manage/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,46 +155,24 @@ func runDeploy(cmd *cobra.Command, args []string) error {
logger := output.DefaultLogger

// Build effective config from: default < config.toml < env < flag
// Start with loaded config.toml values
fileCfg := cfg.FileConfig()
if fileCfg == nil {
fileCfg = &config.FileConfig{}
}

// Apply flag values (flags override config.toml)
if cmd.Flags().Changed("network") {
fileCfg.Network = &deployNetwork
}
if cmd.Flags().Changed("blockchain") {
fileCfg.BlockchainNetwork = &deployBlockchainNetwork
}
if cmd.Flags().Changed("validators") {
fileCfg.Validators = &deployValidators
}
if cmd.Flags().Changed("mode") {
mode := types.ExecutionMode(deployMode)
fileCfg.ExecutionMode = &mode
}
if cmd.Flags().Changed("network-version") {
fileCfg.NetworkVersion = &deployStableVersion
}
if cmd.Flags().Changed("no-cache") {
fileCfg.NoCache = &deployNoCache
}
if cmd.Flags().Changed("accounts") {
fileCfg.Accounts = &deployAccounts
}

// Apply environment variables (env overrides config.toml but not flags)
if networkEnv := os.Getenv("DEVNET_NETWORK"); networkEnv != "" && !cmd.Flags().Changed("network") {
fileCfg.Network = &networkEnv
}
if modeEnv := os.Getenv("DEVNET_MODE"); modeEnv != "" && !cmd.Flags().Changed("mode") {
mode := types.ExecutionMode(modeEnv)
fileCfg.ExecutionMode = &mode
}
if versionEnv := os.Getenv("DEVNET_NETWORK_VERSION"); versionEnv != "" && !cmd.Flags().Changed("network-version") {
fileCfg.NetworkVersion = &versionEnv
resolver := config.NewResolver()
resolved := resolver.ResolveRuntimeFileConfig(cmd, cfg.FileConfig(), config.RuntimeResolveInput{
Network: deployNetwork,
BlockchainNetwork: deployBlockchainNetwork,
Validators: deployValidators,
Mode: types.ExecutionMode(deployMode),
NetworkVersion: deployStableVersion,
NoCache: deployNoCache,
Accounts: deployAccounts,
})
fileCfg := resolved.FileConfig
if cfg.Verbose() {
logger.Debug("Resolved config sources: network=%s mode=%s network_version=%s validators=%s",
resolved.Sources["network"],
resolved.Sources["mode"],
resolved.Sources["network_version"],
resolved.Sources["validators"],
)
}

// Run partial interactive setup for missing base config values
Expand Down
45 changes: 12 additions & 33 deletions cmd/devnet-builder/commands/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package commands

import (
"context"
"os"

"github.com/altuslabsxyz/devnet-builder/cmd/devnet-builder/commands/cache"
configcmd "github.com/altuslabsxyz/devnet-builder/cmd/devnet-builder/commands/config"
Expand Down Expand Up @@ -109,9 +108,6 @@ func persistentPreRunE(cmd *cobra.Command, args []string) error {
// Priority: default < config.toml < env < flag
applyConfigDefaults(cmd, fileCfg)

// Environment variables override config.toml (but not explicit flags)
applyEnvironmentOverrides(cmd)

// Build context-based config from FileConfig and CLI overrides
cfg := ctxconfig.New(
ctxconfig.FromFileConfig(fileCfg),
Expand Down Expand Up @@ -150,35 +146,18 @@ func persistentPreRunE(cmd *cobra.Command, args []string) error {

// applyConfigDefaults applies config file values to global flags if not explicitly set.
func applyConfigDefaults(cmd *cobra.Command, fileCfg *config.FileConfig) {
// Apply home from config.toml
if !cmd.Flags().Changed("home") && fileCfg.Home != nil {
homeDir = *fileCfg.Home
}

// Apply verbose from config.toml
if !cmd.Flags().Changed("verbose") && fileCfg.Verbose != nil {
verbose = *fileCfg.Verbose
}

// Apply json from config.toml
if !cmd.Flags().Changed("json") && fileCfg.JSON != nil {
jsonMode = *fileCfg.JSON
}

// Apply no_color from config.toml
if !cmd.Flags().Changed("no-color") && fileCfg.NoColor != nil {
noColor = *fileCfg.NoColor
}
}

// applyEnvironmentOverrides applies environment variable overrides.
func applyEnvironmentOverrides(cmd *cobra.Command) {
if envHome := os.Getenv("DEVNET_HOME"); envHome != "" && !cmd.Flags().Changed("home") {
homeDir = envHome
}
if os.Getenv("NO_COLOR") != "" && !cmd.Flags().Changed("no-color") {
noColor = true
}
resolver := config.NewResolver()
resolved := resolver.ResolveGlobal(cmd, fileCfg, config.GlobalResolveInput{
Home: homeDir,
Verbose: verbose,
JSON: jsonMode,
NoColor: noColor,
})

homeDir = resolved.Home.Value
verbose = resolved.Verbose.Value
jsonMode = resolved.JSON.Value
noColor = resolved.NoColor.Value
}

// registerCommands registers all subcommands with appropriate group assignments.
Expand Down
Loading
Loading