mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-23 00:35:51 +00:00
feat: 工具层及 mcp 大重构 (#252)
* 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>
This commit is contained in:
211
packages/builtin-tools/src/tools/ConfigTool/supportedSettings.ts
Normal file
211
packages/builtin-tools/src/tools/ConfigTool/supportedSettings.ts
Normal file
@@ -0,0 +1,211 @@
|
||||
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('.')
|
||||
}
|
||||
Reference in New Issue
Block a user