mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-22 08:15:53 +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>
216 lines
5.9 KiB
TypeScript
216 lines
5.9 KiB
TypeScript
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)
|
|
}
|