File size: 5,627 Bytes
064bfd6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 | import { getAllowedSettingSources } from '../../bootstrap/state.js'
/**
* All possible sources where settings can come from
* Order matters - later sources override earlier ones
*/
export const SETTING_SOURCES = [
// User settings (global)
'userSettings',
// Project settings (shared per-directory)
'projectSettings',
// Local settings (gitignored)
'localSettings',
// Flag settings (from --settings flag)
'flagSettings',
// Policy settings (managed-settings.json or remote settings from API)
'policySettings',
] as const
export type SettingSource = (typeof SETTING_SOURCES)[number]
export function getSettingSourceName(source: SettingSource): string {
switch (source) {
case 'userSettings':
return 'user'
case 'projectSettings':
return 'project'
case 'localSettings':
return 'project, gitignored'
case 'flagSettings':
return 'cli flag'
case 'policySettings':
return 'managed'
}
}
/**
* Get short display name for a setting source (capitalized, for context/skills UI)
* @param source The setting source or 'plugin'/'built-in'
* @returns Short capitalized display name like 'User', 'Project', 'Plugin'
*/
export function getSourceDisplayName(
source: SettingSource | 'plugin' | 'built-in',
): string {
switch (source) {
case 'userSettings':
return 'User'
case 'projectSettings':
return 'Project'
case 'localSettings':
return 'Local'
case 'flagSettings':
return 'Flag'
case 'policySettings':
return 'Managed'
case 'plugin':
return 'Plugin'
case 'built-in':
return 'Built-in'
}
}
/**
* Get display name for a setting or permission rule source (lowercase, for inline use)
* @param source The setting source or permission rule source
* @returns Display name for the source in lowercase
*/
export function getSettingSourceDisplayNameLowercase(
source: SettingSource | 'cliArg' | 'command' | 'session',
): string {
switch (source) {
case 'userSettings':
return 'user settings'
case 'projectSettings':
return 'shared project settings'
case 'localSettings':
return 'project local settings'
case 'flagSettings':
return 'command line arguments'
case 'policySettings':
return 'enterprise managed settings'
case 'cliArg':
return 'CLI argument'
case 'command':
return 'command configuration'
case 'session':
return 'current session'
}
}
/**
* Get display name for a setting or permission rule source (capitalized, for UI labels)
* @param source The setting source or permission rule source
* @returns Display name for the source with first letter capitalized
*/
export function getSettingSourceDisplayNameCapitalized(
source: SettingSource | 'cliArg' | 'command' | 'session',
): string {
switch (source) {
case 'userSettings':
return 'User settings'
case 'projectSettings':
return 'Shared project settings'
case 'localSettings':
return 'Project local settings'
case 'flagSettings':
return 'Command line arguments'
case 'policySettings':
return 'Enterprise managed settings'
case 'cliArg':
return 'CLI argument'
case 'command':
return 'Command configuration'
case 'session':
return 'Current session'
}
}
/**
* Parse the --setting-sources CLI flag into SettingSource array
* @param flag Comma-separated string like "user,project,local"
* @returns Array of SettingSource values
*/
export function parseSettingSourcesFlag(flag: string): SettingSource[] {
if (flag === '') return []
const names = flag.split(',').map(s => s.trim())
const result: SettingSource[] = []
for (const name of names) {
switch (name) {
case 'user':
result.push('userSettings')
break
case 'project':
result.push('projectSettings')
break
case 'local':
result.push('localSettings')
break
default:
throw new Error(
`Invalid setting source: ${name}. Valid options are: user, project, local`,
)
}
}
return result
}
/**
* Get enabled setting sources with policy/flag always included
* @returns Array of enabled SettingSource values
*/
export function getEnabledSettingSources(): SettingSource[] {
const allowed = getAllowedSettingSources()
// Always include policy and flag settings
const result = new Set<SettingSource>(allowed)
result.add('policySettings')
result.add('flagSettings')
return Array.from(result)
}
/**
* Check if a specific source is enabled
* @param source The source to check
* @returns true if the source should be loaded
*/
export function isSettingSourceEnabled(source: SettingSource): boolean {
const enabled = getEnabledSettingSources()
return enabled.includes(source)
}
/**
* Editable setting sources (excludes policySettings and flagSettings which are read-only)
*/
export type EditableSettingSource = Exclude<
SettingSource,
'policySettings' | 'flagSettings'
>
/**
* List of sources where permission rules can be saved, in display order.
* Used by permission-rule and hook-save UIs to present source options.
*/
export const SOURCES = [
'localSettings',
'projectSettings',
'userSettings',
] as const satisfies readonly EditableSettingSource[]
/**
* The JSON Schema URL for Claude Code settings
* You can edit the contents at https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/claude-code-settings.json
*/
export const CLAUDE_CODE_SETTINGS_SCHEMA_URL =
'https://json.schemastore.org/claude-code-settings.json'
|