Something went wrong. Try again.
source dump of claude code forked from oppi.li/claude-code
Something went wrong. Try again.
7.0 kB · 245 lines
TypeScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246import type { PermissionRule } from 'src/utils/permissions/PermissionRule.js'import { getSettingsForSource } from 'src/utils/settings/settings.js'import type { SettingsJson } from 'src/utils/settings/types.js'import { BASH_TOOL_NAME } from '../../tools/BashTool/toolName.js'import { SAFE_ENV_VARS } from '../../utils/managedEnvConstants.js'import { getPermissionRulesForSource } from '../../utils/permissions/permissionsLoader.js'
function hasHooks(settings: SettingsJson | null): boolean { if (settings === null || settings.disableAllHooks) { return false } if (settings.statusLine) { return true } if (settings.fileSuggestion) { return true } if (!settings.hooks) { return false } for (const hookConfig of Object.values(settings.hooks)) { if (hookConfig.length > 0) { return true } } return false}
export function getHooksSources(): string[] { const sources: string[] = []
const projectSettings = getSettingsForSource('projectSettings') if (hasHooks(projectSettings)) { sources.push('.claude/settings.json') }
const localSettings = getSettingsForSource('localSettings') if (hasHooks(localSettings)) { sources.push('.claude/settings.local.json') }
return sources}
function hasBashPermission(rules: PermissionRule[]): boolean { return rules.some( rule => rule.ruleBehavior === 'allow' && (rule.ruleValue.toolName === BASH_TOOL_NAME || rule.ruleValue.toolName.startsWith(BASH_TOOL_NAME + '(')), )}
/** * Get which setting sources have bash allow rules. * Returns an array of file paths that have bash permissions. */export function getBashPermissionSources(): string[] { const sources: string[] = []
const projectRules = getPermissionRulesForSource('projectSettings') if (hasBashPermission(projectRules)) { sources.push('.claude/settings.json') }
const localRules = getPermissionRulesForSource('localSettings') if (hasBashPermission(localRules)) { sources.push('.claude/settings.local.json') }
return sources}
/** * Format a list of items with proper "and" conjunction. * @param items - Array of items to format * @param limit - Optional limit for how many items to show before summarizing (ignored if 0) */export function formatListWithAnd(items: string[], limit?: number): string { if (items.length === 0) return ''
// Ignore limit if it's 0 const effectiveLimit = limit === 0 ? undefined : limit
// If no limit or items are within limit, use normal formatting if (!effectiveLimit || items.length <= effectiveLimit) { if (items.length === 1) return items[0]! if (items.length === 2) return `${items[0]} and ${items[1]}`
const lastItem = items[items.length - 1]! const allButLast = items.slice(0, -1) return `${allButLast.join(', ')}, and ${lastItem}` }
// If we have more items than the limit, show first few and count the rest const shown = items.slice(0, effectiveLimit) const remaining = items.length - effectiveLimit
if (shown.length === 1) { return `${shown[0]} and ${remaining} more` }
return `${shown.join(', ')}, and ${remaining} more`}
/** * Check if settings have otelHeadersHelper configured */function hasOtelHeadersHelper(settings: SettingsJson | null): boolean { return !!settings?.otelHeadersHelper}
/** * Get which setting sources have otelHeadersHelper configured. * Returns an array of file paths that have otelHeadersHelper. */export function getOtelHeadersHelperSources(): string[] { const sources: string[] = []
const projectSettings = getSettingsForSource('projectSettings') if (hasOtelHeadersHelper(projectSettings)) { sources.push('.claude/settings.json') }
const localSettings = getSettingsForSource('localSettings') if (hasOtelHeadersHelper(localSettings)) { sources.push('.claude/settings.local.json') }
return sources}
/** * Check if settings have apiKeyHelper configured */function hasApiKeyHelper(settings: SettingsJson | null): boolean { return !!settings?.apiKeyHelper}
/** * Get which setting sources have apiKeyHelper configured. * Returns an array of file paths that have apiKeyHelper. */export function getApiKeyHelperSources(): string[] { const sources: string[] = []
const projectSettings = getSettingsForSource('projectSettings') if (hasApiKeyHelper(projectSettings)) { sources.push('.claude/settings.json') }
const localSettings = getSettingsForSource('localSettings') if (hasApiKeyHelper(localSettings)) { sources.push('.claude/settings.local.json') }
return sources}
/** * Check if settings have AWS commands configured */function hasAwsCommands(settings: SettingsJson | null): boolean { return !!(settings?.awsAuthRefresh || settings?.awsCredentialExport)}
/** * Get which setting sources have AWS commands configured. * Returns an array of file paths that have awsAuthRefresh or awsCredentialExport. */export function getAwsCommandsSources(): string[] { const sources: string[] = []
const projectSettings = getSettingsForSource('projectSettings') if (hasAwsCommands(projectSettings)) { sources.push('.claude/settings.json') }
const localSettings = getSettingsForSource('localSettings') if (hasAwsCommands(localSettings)) { sources.push('.claude/settings.local.json') }
return sources}
/** * Check if settings have GCP commands configured */function hasGcpCommands(settings: SettingsJson | null): boolean { return !!settings?.gcpAuthRefresh}
/** * Get which setting sources have GCP commands configured. * Returns an array of file paths that have gcpAuthRefresh. */export function getGcpCommandsSources(): string[] { const sources: string[] = []
const projectSettings = getSettingsForSource('projectSettings') if (hasGcpCommands(projectSettings)) { sources.push('.claude/settings.json') }
const localSettings = getSettingsForSource('localSettings') if (hasGcpCommands(localSettings)) { sources.push('.claude/settings.local.json') }
return sources}
/** * Check if settings have dangerous environment variables configured. * Any env var NOT in SAFE_ENV_VARS is considered dangerous. */function hasDangerousEnvVars(settings: SettingsJson | null): boolean { if (!settings?.env) { return false } return Object.keys(settings.env).some( key => !SAFE_ENV_VARS.has(key.toUpperCase()), )}
/** * Get which setting sources have dangerous environment variables configured. * Returns an array of file paths that have env vars not in SAFE_ENV_VARS. */export function getDangerousEnvVarsSources(): string[] { const sources: string[] = []
const projectSettings = getSettingsForSource('projectSettings') if (hasDangerousEnvVars(projectSettings)) { sources.push('.claude/settings.json') }
const localSettings = getSettingsForSource('localSettings') if (hasDangerousEnvVars(localSettings)) { sources.push('.claude/settings.local.json') }
return sources}