88 getConfig ,
99 getDefaultConfig ,
1010 updateConfig ,
11- clearAllConfig ,
11+ getConfigAtLevel ,
12+ clearConfigAtLevel ,
13+ ConfigLevel ,
1214} from '../settings/config.js' ;
1315import { nameToLogIndex } from '../utils/nameToLogIndex.js' ;
1416
@@ -89,6 +91,46 @@ export const command: CommandModule<SharedOptions, ConfigOptions> = {
8991 logLevel : nameToLogIndex ( argv . logLevel ) ,
9092 } ) ;
9193
94+ // Determine which config level to use based on flags
95+ const configLevel =
96+ argv . global || argv . g ? ConfigLevel . GLOBAL : ConfigLevel . PROJECT ;
97+ const levelName = configLevel === ConfigLevel . GLOBAL ? 'global' : 'project' ;
98+
99+ // Check if project level is writable when needed for operations that write to config
100+ if (
101+ configLevel === ConfigLevel . PROJECT &&
102+ ( argv . command === 'set' ||
103+ ( argv . command === 'clear' && ( argv . key || argv . all ) ) )
104+ ) {
105+ try {
106+ // Import directly to avoid circular dependency
107+ const { isProjectSettingsDirWritable } = await import (
108+ '../settings/settings.js'
109+ ) ;
110+ if ( ! isProjectSettingsDirWritable ( ) ) {
111+ logger . error (
112+ chalk . red (
113+ 'Cannot write to project configuration directory. Check permissions or use --global flag.' ,
114+ ) ,
115+ ) ;
116+ logger . info (
117+ 'You can use the --global (-g) flag to modify global configuration instead.' ,
118+ ) ;
119+ return ;
120+ }
121+ } catch ( error : unknown ) {
122+ const errorMessage =
123+ error instanceof Error ? error . message : String ( error ) ;
124+ logger . error (
125+ chalk . red (
126+ `Error checking project directory permissions: ${ errorMessage } ` ,
127+ ) ,
128+ ) ;
129+ return ;
130+ }
131+ }
132+
133+ // Get merged config for display
92134 const config = getConfig ( ) ;
93135
94136 // Handle 'list' command
@@ -206,10 +248,28 @@ export const command: CommandModule<SharedOptions, ConfigOptions> = {
206248 }
207249 }
208250
209- const updatedConfig = updateConfig ( { [ argv . key ] : parsedValue } ) ;
210- logger . info (
211- `Updated ${ argv . key } : ${ chalk . green ( updatedConfig [ argv . key as keyof typeof updatedConfig ] ) } ` ,
212- ) ;
251+ try {
252+ // Update config at the specified level
253+ const updatedConfig = updateConfig (
254+ { [ argv . key ] : parsedValue } ,
255+ configLevel ,
256+ ) ;
257+
258+ logger . info (
259+ `Updated ${ argv . key } : ${ chalk . green ( updatedConfig [ argv . key as keyof typeof updatedConfig ] ) } at ${ levelName } level` ,
260+ ) ;
261+ } catch ( error : unknown ) {
262+ const errorMessage =
263+ error instanceof Error ? error . message : String ( error ) ;
264+ logger . error (
265+ chalk . red ( `Failed to update configuration: ${ errorMessage } ` ) ,
266+ ) ;
267+ if ( configLevel === ConfigLevel . PROJECT ) {
268+ logger . info (
269+ 'You can use the --global (-g) flag to modify global configuration instead.' ,
270+ ) ;
271+ }
272+ }
213273 return ;
214274 }
215275
@@ -227,11 +287,24 @@ export const command: CommandModule<SharedOptions, ConfigOptions> = {
227287 return ;
228288 }
229289
230- // Clear all settings
231- clearAllConfig ( ) ;
232- logger . info (
233- 'All configuration settings have been cleared. Default values will be used.' ,
234- ) ;
290+ try {
291+ // Clear settings at the specified level
292+ clearConfigAtLevel ( configLevel ) ;
293+ logger . info (
294+ `All ${ levelName } configuration settings have been cleared.` ,
295+ ) ;
296+ } catch ( error : unknown ) {
297+ const errorMessage =
298+ error instanceof Error ? error . message : String ( error ) ;
299+ logger . error (
300+ chalk . red ( `Failed to clear configuration: ${ errorMessage } ` ) ,
301+ ) ;
302+ if ( configLevel === ConfigLevel . PROJECT ) {
303+ logger . info (
304+ 'You can use the --global (-g) flag to modify global configuration instead.' ,
305+ ) ;
306+ }
307+ }
235308 return ;
236309 }
237310
@@ -272,8 +345,32 @@ export const command: CommandModule<SharedOptions, ConfigOptions> = {
272345 const defaultValue =
273346 defaultConfig [ argv . key as keyof typeof defaultConfig ] ;
274347
348+ // Get the effective config after clearing
349+ const updatedConfig = getConfig ( ) ;
350+ const newValue = updatedConfig [ argv . key as keyof typeof updatedConfig ] ;
351+
352+ // Determine where the new value is coming from
353+ const isDefaultAfterClear =
354+ JSON . stringify ( newValue ) === JSON . stringify ( defaultValue ) ;
355+ const afterClearInGlobal =
356+ ! isDefaultAfterClear &&
357+ argv . key in getConfigAtLevel ( ConfigLevel . GLOBAL ) ;
358+ const afterClearInProject =
359+ ! isDefaultAfterClear &&
360+ ! afterClearInGlobal &&
361+ argv . key in getConfigAtLevel ( ConfigLevel . PROJECT ) ;
362+
363+ let sourceDisplay = '' ;
364+ if ( isDefaultAfterClear ) {
365+ sourceDisplay = '(default)' ;
366+ } else if ( afterClearInProject ) {
367+ sourceDisplay = '(from project config)' ;
368+ } else if ( afterClearInGlobal ) {
369+ sourceDisplay = '(from global config)' ;
370+ }
371+
275372 logger . info (
276- `Cleared ${ argv . key } , now using default value : ${ chalk . green ( defaultValue ) } ` ,
373+ `Cleared ${ argv . key } at ${ levelName } level , now using: ${ chalk . green ( newValue ) } ${ sourceDisplay } ` ,
277374 ) ;
278375 return ;
279376 }
0 commit comments