mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-23 08:45:50 +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:
215
packages/builtin-tools/src/tools/LSPTool/schemas.ts
Normal file
215
packages/builtin-tools/src/tools/LSPTool/schemas.ts
Normal file
@@ -0,0 +1,215 @@
|
||||
import { z } from 'zod/v4'
|
||||
import { lazySchema } from 'src/utils/lazySchema.js'
|
||||
|
||||
/**
|
||||
* Discriminated union of all LSP operations
|
||||
* Uses 'operation' as the discriminator field
|
||||
*/
|
||||
export const lspToolInputSchema = lazySchema(() => {
|
||||
/**
|
||||
* Go to Definition operation
|
||||
* Finds the definition location of a symbol at the given position
|
||||
*/
|
||||
const goToDefinitionSchema = z.strictObject({
|
||||
operation: z.literal('goToDefinition'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
/**
|
||||
* Find References operation
|
||||
* Finds all references to a symbol at the given position
|
||||
*/
|
||||
const findReferencesSchema = z.strictObject({
|
||||
operation: z.literal('findReferences'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
/**
|
||||
* Hover operation
|
||||
* Gets hover information (documentation, type info) for a symbol at the given position
|
||||
*/
|
||||
const hoverSchema = z.strictObject({
|
||||
operation: z.literal('hover'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
/**
|
||||
* Document Symbol operation
|
||||
* Gets all symbols (functions, classes, variables) in a document
|
||||
*/
|
||||
const documentSymbolSchema = z.strictObject({
|
||||
operation: z.literal('documentSymbol'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
/**
|
||||
* Workspace Symbol operation
|
||||
* Searches for symbols across the entire workspace
|
||||
*/
|
||||
const workspaceSymbolSchema = z.strictObject({
|
||||
operation: z.literal('workspaceSymbol'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
/**
|
||||
* Go to Implementation operation
|
||||
* Finds the implementation locations of an interface or abstract method
|
||||
*/
|
||||
const goToImplementationSchema = z.strictObject({
|
||||
operation: z.literal('goToImplementation'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
/**
|
||||
* Prepare Call Hierarchy operation
|
||||
* Prepares a call hierarchy item at the given position (first step for call hierarchy)
|
||||
*/
|
||||
const prepareCallHierarchySchema = z.strictObject({
|
||||
operation: z.literal('prepareCallHierarchy'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
/**
|
||||
* Incoming Calls operation
|
||||
* Finds all functions/methods that call the function at the given position
|
||||
*/
|
||||
const incomingCallsSchema = z.strictObject({
|
||||
operation: z.literal('incomingCalls'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
/**
|
||||
* Outgoing Calls operation
|
||||
* Finds all functions/methods called by the function at the given position
|
||||
*/
|
||||
const outgoingCallsSchema = z.strictObject({
|
||||
operation: z.literal('outgoingCalls'),
|
||||
filePath: z.string().describe('The absolute or relative path to the file'),
|
||||
line: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The line number (1-based, as shown in editors)'),
|
||||
character: z
|
||||
.number()
|
||||
.int()
|
||||
.positive()
|
||||
.describe('The character offset (1-based, as shown in editors)'),
|
||||
})
|
||||
|
||||
return z.discriminatedUnion('operation', [
|
||||
goToDefinitionSchema,
|
||||
findReferencesSchema,
|
||||
hoverSchema,
|
||||
documentSymbolSchema,
|
||||
workspaceSymbolSchema,
|
||||
goToImplementationSchema,
|
||||
prepareCallHierarchySchema,
|
||||
incomingCallsSchema,
|
||||
outgoingCallsSchema,
|
||||
])
|
||||
})
|
||||
|
||||
/**
|
||||
* TypeScript type for LSPTool input
|
||||
*/
|
||||
export type LSPToolInput = z.infer<ReturnType<typeof lspToolInputSchema>>
|
||||
|
||||
/**
|
||||
* Type guard to check if an operation is a valid LSP operation
|
||||
*/
|
||||
export function isValidLSPOperation(
|
||||
operation: string,
|
||||
): operation is LSPToolInput['operation'] {
|
||||
return [
|
||||
'goToDefinition',
|
||||
'findReferences',
|
||||
'hover',
|
||||
'documentSymbol',
|
||||
'workspaceSymbol',
|
||||
'goToImplementation',
|
||||
'prepareCallHierarchy',
|
||||
'incomingCalls',
|
||||
'outgoingCalls',
|
||||
].includes(operation)
|
||||
}
|
||||
Reference in New Issue
Block a user