mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-17 22:05:50 +00:00
* feat: 第一版大重构 * fix: 修复类型问题 * chore: 更新版本到 1.3.2 * Add brave as alternative WebSearchTool * fix: 修正顺序 * fix: 修复对穷鬼模式的 auto dream 和 session memory 越过 * feat: 穷鬼模式去除 session-summary * feat: 创建 builtin-tools 包,搬运所有工具实现 将 src/tools/ 下的全部 60 个工具目录迁移至 packages/builtin-tools/src/tools/, 内部导入路径已更新为 src/ alias 模式。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: 更新 src/ 中所有工具引用至 builtin-tools 包,删除 src/tools/ - src/tools.ts 及 178 个 src/ 文件的 import 路径从 ./tools/ 改为 builtin-tools/tools/ - 删除 src/tools/ 整个目录(已迁移至 packages/builtin-tools/) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: 添加 builtin-tools 路径别名至 tsconfig,更新 bun.lock - tsconfig.json 新增 builtin-tools/* 和 builtin-tools 路径映射 - 新增 packages/builtin-tools/src 至 include Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: 为 builtin-tools、mcp-client、agent-tools 添加 @claude-code-best 作用域前缀 所有包名及 import 路径统一添加 @claude-code-best/ 前缀: - builtin-tools → @claude-code-best/builtin-tools - mcp-client → @claude-code-best/mcp-client - agent-tools → @claude-code-best/agent-tools Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 修复 node 环境没有 bun 的问题 --------- Co-authored-by: Eric-Guo <eric.guocz@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
212 lines
6.2 KiB
TypeScript
212 lines
6.2 KiB
TypeScript
import { feature } from 'bun:bundle'
|
|
import { getRemoteControlAtStartup } from 'src/utils/config.js'
|
|
import {
|
|
EDITOR_MODES,
|
|
NOTIFICATION_CHANNELS,
|
|
TEAMMATE_MODES,
|
|
} from 'src/utils/configConstants.js'
|
|
import { getModelOptions } from 'src/utils/model/modelOptions.js'
|
|
import { validateModel } from 'src/utils/model/validateModel.js'
|
|
import { THEME_NAMES, THEME_SETTINGS } from 'src/utils/theme.js'
|
|
|
|
/** AppState keys that can be synced for immediate UI effect */
|
|
type SyncableAppStateKey = 'verbose' | 'mainLoopModel' | 'thinkingEnabled'
|
|
|
|
type SettingConfig = {
|
|
source: 'global' | 'settings'
|
|
type: 'boolean' | 'string'
|
|
description: string
|
|
path?: string[]
|
|
options?: readonly string[]
|
|
getOptions?: () => string[]
|
|
appStateKey?: SyncableAppStateKey
|
|
/** Async validation called when writing/setting a value */
|
|
validateOnWrite?: (v: unknown) => Promise<{ valid: boolean; error?: string }>
|
|
/** Format value when reading/getting for display */
|
|
formatOnRead?: (v: unknown) => unknown
|
|
}
|
|
|
|
export const SUPPORTED_SETTINGS: Record<string, SettingConfig> = {
|
|
theme: {
|
|
source: 'global',
|
|
type: 'string',
|
|
description: 'Color theme for the UI',
|
|
options: feature('AUTO_THEME') ? THEME_SETTINGS : THEME_NAMES,
|
|
},
|
|
editorMode: {
|
|
source: 'global',
|
|
type: 'string',
|
|
description: 'Key binding mode',
|
|
options: EDITOR_MODES,
|
|
},
|
|
verbose: {
|
|
source: 'global',
|
|
type: 'boolean',
|
|
description: 'Show detailed debug output',
|
|
appStateKey: 'verbose',
|
|
},
|
|
preferredNotifChannel: {
|
|
source: 'global',
|
|
type: 'string',
|
|
description: 'Preferred notification channel',
|
|
options: NOTIFICATION_CHANNELS,
|
|
},
|
|
autoCompactEnabled: {
|
|
source: 'global',
|
|
type: 'boolean',
|
|
description: 'Auto-compact when context is full',
|
|
},
|
|
autoMemoryEnabled: {
|
|
source: 'settings',
|
|
type: 'boolean',
|
|
description: 'Enable auto-memory',
|
|
},
|
|
autoDreamEnabled: {
|
|
source: 'settings',
|
|
type: 'boolean',
|
|
description: 'Enable background memory consolidation',
|
|
},
|
|
fileCheckpointingEnabled: {
|
|
source: 'global',
|
|
type: 'boolean',
|
|
description: 'Enable file checkpointing for code rewind',
|
|
},
|
|
showTurnDuration: {
|
|
source: 'global',
|
|
type: 'boolean',
|
|
description:
|
|
'Show turn duration message after responses (e.g., "Cooked for 1m 6s")',
|
|
},
|
|
terminalProgressBarEnabled: {
|
|
source: 'global',
|
|
type: 'boolean',
|
|
description: 'Show OSC 9;4 progress indicator in supported terminals',
|
|
},
|
|
todoFeatureEnabled: {
|
|
source: 'global',
|
|
type: 'boolean',
|
|
description: 'Enable todo/task tracking',
|
|
},
|
|
model: {
|
|
source: 'settings',
|
|
type: 'string',
|
|
description: 'Override the default model',
|
|
appStateKey: 'mainLoopModel',
|
|
getOptions: () => {
|
|
try {
|
|
return getModelOptions()
|
|
.filter(o => o.value !== null)
|
|
.map(o => o.value as string)
|
|
} catch {
|
|
return ['sonnet', 'opus', 'haiku']
|
|
}
|
|
},
|
|
validateOnWrite: v => validateModel(String(v)),
|
|
formatOnRead: v => (v === null ? 'default' : v),
|
|
},
|
|
alwaysThinkingEnabled: {
|
|
source: 'settings',
|
|
type: 'boolean',
|
|
description: 'Enable extended thinking (false to disable)',
|
|
appStateKey: 'thinkingEnabled',
|
|
},
|
|
'permissions.defaultMode': {
|
|
source: 'settings',
|
|
type: 'string',
|
|
description: 'Default permission mode for tool usage',
|
|
options: feature('TRANSCRIPT_CLASSIFIER')
|
|
? ['default', 'plan', 'acceptEdits', 'dontAsk', 'auto']
|
|
: ['default', 'plan', 'acceptEdits', 'dontAsk'],
|
|
},
|
|
language: {
|
|
source: 'settings',
|
|
type: 'string',
|
|
description:
|
|
'Preferred language for Claude responses and voice dictation (e.g., "japanese", "spanish")',
|
|
},
|
|
teammateMode: {
|
|
source: 'global',
|
|
type: 'string',
|
|
description:
|
|
'How to spawn teammates: "tmux" for traditional tmux, "in-process" for same process, "auto" to choose automatically',
|
|
options: TEAMMATE_MODES,
|
|
},
|
|
...(process.env.USER_TYPE === 'ant'
|
|
? {
|
|
classifierPermissionsEnabled: {
|
|
source: 'settings' as const,
|
|
type: 'boolean' as const,
|
|
description:
|
|
'Enable AI-based classification for Bash(prompt:...) permission rules',
|
|
},
|
|
}
|
|
: {}),
|
|
...(feature('VOICE_MODE')
|
|
? {
|
|
voiceEnabled: {
|
|
source: 'settings' as const,
|
|
type: 'boolean' as const,
|
|
description: 'Enable voice dictation (hold-to-talk)',
|
|
},
|
|
}
|
|
: {}),
|
|
...(feature('BRIDGE_MODE')
|
|
? {
|
|
remoteControlAtStartup: {
|
|
source: 'global' as const,
|
|
type: 'boolean' as const,
|
|
description:
|
|
'Enable Remote Control for all sessions (true | false | default)',
|
|
formatOnRead: () => getRemoteControlAtStartup(),
|
|
},
|
|
}
|
|
: {}),
|
|
...(feature('KAIROS') || feature('KAIROS_PUSH_NOTIFICATION')
|
|
? {
|
|
taskCompleteNotifEnabled: {
|
|
source: 'global' as const,
|
|
type: 'boolean' as const,
|
|
description:
|
|
'Push to your mobile device when idle after Claude finishes (requires Remote Control)',
|
|
},
|
|
inputNeededNotifEnabled: {
|
|
source: 'global' as const,
|
|
type: 'boolean' as const,
|
|
description:
|
|
'Push to your mobile device when a permission prompt or question is waiting (requires Remote Control)',
|
|
},
|
|
agentPushNotifEnabled: {
|
|
source: 'global' as const,
|
|
type: 'boolean' as const,
|
|
description:
|
|
'Allow Claude to push to your mobile device when it deems it appropriate (requires Remote Control)',
|
|
},
|
|
}
|
|
: {}),
|
|
}
|
|
|
|
export function isSupported(key: string): boolean {
|
|
return key in SUPPORTED_SETTINGS
|
|
}
|
|
|
|
export function getConfig(key: string): SettingConfig | undefined {
|
|
return SUPPORTED_SETTINGS[key]
|
|
}
|
|
|
|
export function getAllKeys(): string[] {
|
|
return Object.keys(SUPPORTED_SETTINGS)
|
|
}
|
|
|
|
export function getOptionsForSetting(key: string): string[] | undefined {
|
|
const config = SUPPORTED_SETTINGS[key]
|
|
if (!config) return undefined
|
|
if (config.options) return [...config.options]
|
|
if (config.getOptions) return config.getOptions()
|
|
return undefined
|
|
}
|
|
|
|
export function getPath(key: string): string[] {
|
|
const config = SUPPORTED_SETTINGS[key]
|
|
return config?.path ?? key.split('.')
|
|
}
|