entrypoints/ — 多入口支持
目录: src/entrypoints/
Claude Code 不是单一 CLI——它有多个启动方式,对应不同的使用场景。entrypoints/ 统一管理这些入口。
入口一览
entrypoints/
├── cli.ts - 交互式 CLI (默认)
├── noninteractive.ts - 一次性执行
├── mcp-server.ts - 作为 MCP Server
├── ide-stdio.ts - IDE 插件 stdio
├── ide-http.ts - IDE 插件 HTTP
├── web.ts - Web UI 后端
├── worker.ts - 远程 worker
└── test-runner.ts - 测试用
1. CLI 入口(默认)
claude
# 或
claude
启动交互式 REPL:
// entrypoints/cli.ts
async function main() {
const args = parseArgs(process.argv)
const ctx = await bootstrap()
await startREPL(ctx)
}
特点:
- TTY 模式
- 完整 TUI
- 长会话
2. 非交互入口
claude -p "fix this bug" --file bug.ts
// entrypoints/noninteractive.ts
async function main(prompt: string) {
const ctx = await bootstrap()
const response = await runOnce(ctx, prompt)
console.log(response)
process.exit(0)
}
特点:
- 一次执行退出
- 纯文本输出
- CI/CD 友好
3. MCP Server 入口
claude mcp-server
# 或放在其他工具的 mcp config 里
// entrypoints/mcp-server.ts
async function main() {
const server = new MCPServer({
name: 'claude-code',
version: VERSION,
})
server.addTool('refactor', refactorHandler)
server.addTool('analyze', analyzeHandler)
await server.start({ transport: 'stdio' })
}
特点:
- 把 Claude Code 能力暴露为 MCP 工具
- 给其他 AI 应用使用(比如 Cursor、Cline)
4. IDE stdio 入口
VS Code 插件启动 Claude Code 子进程:
// entrypoints/ide-stdio.ts
async function main() {
const bridge = new StdioBridge(process.stdin, process.stdout)
const ctx = await bootstrap({ mode: 'ide' })
bridge.on('prompt', async (text) => {
const response = await runAgent(ctx, text)
bridge.send({ type: 'response', content: response })
})
}
特点:
- JSON-RPC over stdio
- 无 TUI(UI 在 IDE)
- 事件驱动
5. IDE HTTP 入口
替代 stdio——IDE 通过 HTTP 连接:
// entrypoints/ide-http.ts
async function main() {
const port = await findFreePort()
const app = express()
app.post('/prompt', async (req, res) => {
const response = await runAgent(req.body.prompt)
res.json(response)
})
app.listen(port)
}
特点:
- 跨语言 IDE 集成
- 本地网络通信
6. Web UI 后端
// entrypoints/web.ts
async function main() {
const ctx = await bootstrap()
const server = createHTTPServer(ctx)
server.listen(process.env.PORT ?? 8080)
}
特点:
- 远程部署
- 多租户(每会话独立 ctx)
- 认证层
7. Worker 入口(远程触发)
// entrypoints/worker.ts
async function main() {
const triggerId = process.env.TRIGGER_ID
const trigger = await loadTrigger(triggerId)
const ctx = await bootstrap({ mode: 'worker' })
const result = await runAgent(ctx, trigger.prompt)
await reportResult(triggerId, result)
process.exit(0)
}
特点:
- 单次执行
- 远程触发
- 结果回调
入口选择
// 根据 argv[2] 选择入口
const entrypoint = process.argv[2]
switch (entrypoint) {
case 'mcp-server': return entrypoints.mcpServer()
case 'worker': return entrypoints.worker()
case 'web': return entrypoints.web()
default: return entrypoints.cli()
}
或通过环境:
if (process.env.CLAUDE_ENTRYPOINT === 'worker') {
return entrypoints.worker()
}
入口共享的初始化
所有入口都经过核心 bootstrap:
async function bootstrap(opts: BootOpts) {
const config = await loadConfig(opts)
const auth = await initAuth(config)
const tools = await loadTools()
const services = await startServices()
return { config, auth, tools, services }
}
入口只负责:
- 参数解析
- UI/通信协议
- 结束处理
核心逻辑被所有入口复用。
入口特定的优化
CLI 入口
// 尽快显示 TUI,后台继续加载
showWelcome()
const ctx = await quickBoot()
startREPL(ctx)
backgroundLoad(ctx)
Worker 入口
// 无 TUI,无交互初始化
const ctx = await fastBoot({ skipUI: true })
MCP Server 入口
// stdio 模式,压缩所有日志
process.env.LOG_FILE = '/tmp/mcp-server.log'
入口的退出处理
// CLI — 保存会话后退出
process.on('SIGINT', async () => {
await saveSession()
await flushAnalytics()
process.exit(0)
})
// Worker — 汇报结果后退出
process.on('exit', async () => {
await reportResult()
})
测试入口
// entrypoints/test-runner.ts
async function main() {
const ctx = await bootstrap({ mode: 'test' })
// 跑内置测试
await runTests(ctx)
process.exit(failedCount)
}
用于 CI 验证。
值得学习的点
- 多入口架构 — 一套核心多种用法
- 共享 bootstrap — 避免重复初始化
- 入口特定优化 — CLI 快显示,worker 无 UI
- 协议层分离 — stdio/http/JSON-RPC
- 退出处理差异 — 每种入口不同
- 测试入口 — CI 友好