@@ -36,76 +36,98 @@ func runList(cmd *cobra.Command, args []string) error {
3636 }
3737
3838 var vars map [string ]string
39+ var overrides map [string ]string
40+
41+ // Derive key once — used for local vault regardless of mode
42+ masterKeyHex , err := promptAndDeriveKey (cfg )
43+ if err != nil {
44+ return err
45+ }
46+
47+ localVault , err := vault .Open (cfg .VaultPath , masterKeyHex )
48+ if err != nil {
49+ return err
50+ }
51+ defer localVault .Close ()
3952
4053 if cfg .HasServer () {
4154 client := serverclient .New (cfg .ServerURL , cfg .ServerAPIKey )
4255 vars , err = client .GetVariables (cfg .ActiveProject , cfg .ActiveEnv )
4356 if err != nil {
4457 return fmt .Errorf ("error fetching variables from server: %w" , err )
4558 }
46- } else {
47- masterKeyHex , err := promptAndDeriveKey (cfg )
48- if err != nil {
49- return err
50- }
5159
52- v , err := vault . Open (cfg .VaultPath , masterKeyHex )
60+ overrides , err = localVault . GetLocalOverrides (cfg .ActiveProject , cfg . ActiveEnv )
5361 if err != nil {
54- return err
62+ return fmt . Errorf ( "error reading local overrides: %w" , err )
5563 }
56- defer v .Close ()
57-
58- projectID , _ , err := v .GetProjectByPath (getCurrentDir ())
64+ } else {
65+ projectID , _ , err := localVault .GetProjectByPath (getCurrentDir ())
5966 if err != nil {
6067 return err
6168 }
6269 if projectID == 0 {
6370 return fmt .Errorf ("project not found in vault, run 'enveil init'" )
6471 }
6572
66- envID , err := v .GetEnvironment (projectID , cfg .ActiveEnv )
73+ envID , err := localVault .GetEnvironment (projectID , cfg .ActiveEnv )
6774 if err != nil {
6875 return err
6976 }
7077 if envID == 0 {
7178 return fmt .Errorf ("environment '%s' not found" , cfg .ActiveEnv )
7279 }
7380
74- vars , err = v .GetVariables (envID )
81+ vars , err = localVault .GetVariables (envID )
7582 if err != nil {
7683 return err
7784 }
7885 }
7986
8087 ui .Header (fmt .Sprintf ("%s %s" , cfg .ActiveProject , ui .EnvBadge (cfg .ActiveProject , cfg .ActiveEnv )))
8188
82- if len (vars ) == 0 {
89+ if len (vars ) == 0 && len ( overrides ) == 0 {
8390 ui .Muted (" No variables in this environment." )
8491 fmt .Println ()
8592 return nil
8693 }
8794
88- // Find longest key for alignment
89- maxLen := 0
95+ allKeys := make (map [string ]struct {})
9096 for k := range vars {
97+ allKeys [k ] = struct {}{}
98+ }
99+ for k := range overrides {
100+ allKeys [k ] = struct {}{}
101+ }
102+
103+ maxLen := 0
104+ for k := range allKeys {
91105 if len (k ) > maxLen {
92106 maxLen = len (k )
93107 }
94108 }
95109
96- // Sort keys
97- keys := make ([]string , 0 , len (vars ))
98- for k := range vars {
110+ keys := make ([]string , 0 , len (allKeys ))
111+ for k := range allKeys {
99112 keys = append (keys , k )
100113 }
101114 sort .Strings (keys )
102115
116+ localCount := 0
103117 for _ , k := range keys {
104- fmt .Printf (" %-*s = ***\n " , maxLen , k )
118+ if _ , isOverride := overrides [k ]; isOverride {
119+ fmt .Printf (" %-*s = *** [local override]\n " , maxLen , k )
120+ localCount ++
121+ } else {
122+ fmt .Printf (" %-*s = ***\n " , maxLen , k )
123+ }
105124 }
106125
107126 fmt .Println ()
108- ui .Muted (" %d variable(s) total" , len (vars ))
127+ ui .Muted (" %d variable(s) total" , len (allKeys ))
128+ if localCount > 0 {
129+ ui .Muted (" %d local override(s) — visible only on this machine" , localCount )
130+ }
109131 fmt .Println ()
110132 return nil
111133}
0 commit comments