API 参考
欢迎使用 Trae IDE API 参考文档。本文档提供了完整的 API 接口说明,帮助您开发强大的 Trae IDE 扩展。
API 概述
Trae IDE API 提供了丰富的接口,让您能够:n- 创建和管理扩展
- 操作编辑器和文档
- 利用 AI 功能
- 自定义用户界面
- 访问工作区和文件系统
- 集成开发工具
API 分类
核心 API
编辑器 API
文本编辑器操作、文档管理、选择和光标控制。
typescript
// 获取当前活动编辑器
const editor = TraeAPI.window.activeTextEditor;
if (editor) {
// 插入文本
editor.edit(editBuilder => {
editBuilder.insert(editor.selection.active, 'Hello, World!');
});
}扩展 API
扩展生命周期、命令注册、UI 贡献、配置管理。
typescript
// 注册命令
const disposable = TraeAPI.commands.registerCommand('myExtension.hello', () => {
TraeAPI.window.showInformationMessage('你好,世界!');
});
context.subscriptions.push(disposable);AI 与智能功能
AI API
人工智能代码生成、分析、聊天助手、智能补全。
typescript
// AI 代码生成
const response = await TraeAPI.ai.generateCode({
prompt: '创建一个计算阶乘的函数',
language: 'typescript'
});
console.log('生成的代码:', response.code);开发工具
调试 API
调试会话管理、断点控制、变量检查。
typescript
// 启动调试会话
const config = {
type: 'node',
request: 'launch',
name: '启动程序',
program: '${workspaceFolder}/app.js'
};
TraeAPI.debug.startDebugging(undefined, config);任务 API
任务定义、执行、监控。
typescript
// 执行任务
const task = new TraeAPI.Task(
{ type: 'shell' },
TraeAPI.TaskScope.Workspace,
'构建项目',
'npm',
new TraeAPI.ShellExecution('npm run build')
);
TraeAPI.tasks.executeTask(task);扩展与插件
语言服务 API
语言支持、语法高亮、智能感知、代码操作。
typescript
// 注册悬停提供程序
TraeAPI.languages.registerHoverProvider('typescript', {
provideHover(document, position) {
const range = document.getWordRangeAtPosition(position);
if (range) {
const word = document.getText(range);
return new TraeAPI.Hover(`关于 ${word} 的信息`);
}
}
});主题 API
颜色主题、图标主题、自定义样式。
typescript
// 获取当前主题
const theme = TraeAPI.window.activeColorTheme;
console.log('当前主题类型:', theme.kind);快速开始
创建第一个扩展
- 初始化扩展项目
bash
# 使用 Trae CLI 创建扩展
trae-cli create-extension my-first-extension
cd my-first-extension- 扩展清单文件 (package.json)
json
{
"name": "my-first-extension",
"displayName": "我的第一个扩展",
"description": "一个示例扩展",
"version": "1.0.0",
"publisher": "your-publisher",
"engines": {
"trae": "^1.0.0"
},
"categories": ["其他"],
"activationEvents": [
"onCommand:myExtension.helloWorld"
],
"main": "./out/extension.js",
"contributes": {
"commands": [
{
"command": "myExtension.helloWorld",
"title": "你好世界"
}
]
}
}- 扩展入口文件 (src/extension.ts)
typescript
import * as TraeAPI from '@trae/api';
export function activate(context: TraeAPI.ExtensionContext) {
console.log('扩展 "my-first-extension" 已激活!');
const disposable = TraeAPI.commands.registerCommand(
'myExtension.helloWorld',
() => {
TraeAPI.window.showInformationMessage('你好,来自我的扩展!');
}
);
context.subscriptions.push(disposable);
}
export function deactivate() {
console.log('扩展已停用');
}- TypeScript 配置 (tsconfig.json)
json
{
"compilerOptions": {
"module": "commonjs",
"target": "ES2020",
"outDir": "out",
"lib": ["ES2020"],
"sourceMap": true,
"rootDir": "src",
"strict": true
},
"exclude": ["node_modules", ".trae-test"]
}- 构建和测试
bash
# 安装依赖
npm install
# 编译 TypeScript
npm run compile
# 在开发模式下测试扩展
F5 # 或使用调试面板认证
API 密钥管理
typescript
// 存储 API 密钥
const secrets = context.secrets;
await secrets.store('apiKey', 'your-secret-key');
// 获取 API 密钥
const apiKey = await secrets.get('apiKey');
// 删除 API 密钥
await secrets.delete('apiKey');用户认证
typescript
// 获取用户信息
const user = await TraeAPI.authentication.getSession('github');
if (user) {
console.log('用户已登录:', user.account.label);
} else {
// 请求用户登录
const session = await TraeAPI.authentication.getSession('github', [], {
createIfNone: true
});
}错误处理
常见错误类型
typescript
try {
await TraeAPI.commands.executeCommand('nonexistent.command');
} catch (error) {
if (error instanceof TraeAPI.CommandNotFoundError) {
TraeAPI.window.showErrorMessage('命令未找到');
} else if (error instanceof TraeAPI.PermissionError) {
TraeAPI.window.showErrorMessage('权限不足');
} else {
TraeAPI.window.showErrorMessage(`未知错误: ${error.message}`);
}
}错误报告
typescript
// 报告错误到遥测
TraeAPI.telemetry.sendErrorTelemetry('extensionError', {
errorMessage: error.message,
stackTrace: error.stack,
extensionId: context.extension.id
});事件系统
监听系统事件
typescript
// 监听文件变化
TraeAPI.workspace.onDidChangeTextDocument(event => {
console.log('文档已更改:', event.document.fileName);
});
// 监听活动编辑器变化
TraeAPI.window.onDidChangeActiveTextEditor(editor => {
if (editor) {
console.log('活动编辑器已更改:', editor.document.fileName);
}
});
// 监听配置变化
TraeAPI.workspace.onDidChangeConfiguration(event => {
if (event.affectsConfiguration('myExtension')) {
console.log('扩展配置已更改');
}
});自定义事件
typescript
// 创建事件发射器
const onDataChanged = new TraeAPI.EventEmitter<string>();
export const onDataChangedEvent = onDataChanged.event;
// 触发事件
function updateData(newData: string) {
// 更新数据逻辑
onDataChanged.fire(newData);
}
// 监听自定义事件
onDataChangedEvent(data => {
console.log('数据已更新:', data);
});配置
扩展配置
typescript
// 在 package.json 中定义配置
{
"contributes": {
"configuration": {
"title": "我的扩展",
"properties": {
"myExtension.enable": {
"type": "boolean",
"default": true,
"description": "启用我的扩展"
},
"myExtension.maxItems": {
"type": "number",
"default": 10,
"minimum": 1,
"maximum": 100,
"description": "最大项目数"
}
}
}
}
}
// 读取配置
const config = TraeAPI.workspace.getConfiguration('myExtension');
const isEnabled = config.get<boolean>('enable', true);
const maxItems = config.get<number>('maxItems', 10);
// 更新配置
await config.update('maxItems', 20, TraeAPI.ConfigurationTarget.Global);工作区配置
typescript
// 读取工作区设置
const workspaceConfig = TraeAPI.workspace.getConfiguration();
const editorFontSize = workspaceConfig.get('editor.fontSize');
const editorTabSize = workspaceConfig.get('editor.tabSize');
// 获取工作区文件夹
const workspaceFolders = TraeAPI.workspace.workspaceFolders;
if (workspaceFolders && workspaceFolders.length > 0) {
console.log('工作区根目录:', workspaceFolders[0].uri.fsPath);
}测试
单元测试
typescript
// test/suite/extension.test.ts
import * as assert from 'assert';
import * as TraeAPI from '@trae/api';
suite('扩展测试套件', () => {
test('扩展应该存在', () => {
assert.ok(TraeAPI.extensions.getExtension('publisher.my-extension'));
});
test('应该注册命令', async () => {
const commands = await TraeAPI.commands.getCommands();
assert.ok(commands.includes('myExtension.helloWorld'));
});
});集成测试
typescript
// test/suite/integration.test.ts
import * as assert from 'assert';
import * as TraeAPI from '@trae/api';
import * as path from 'path';
suite('集成测试套件', () => {
test('应该打开文档', async () => {
const uri = TraeAPI.Uri.file(path.join(__dirname, '../../test-fixtures/test.ts'));
const document = await TraeAPI.workspace.openTextDocument(uri);
assert.ok(document);
assert.strictEqual(document.languageId, 'typescript');
});
});发布
打包扩展
bash
# 安装 Trae CLI
npm install -g @trae/cli
# 打包扩展
trae-cli package
# 发布到市场
trae-cli publish版本管理
json
{
"scripts": {
"vscode:prepublish": "npm run compile",
"compile": "tsc -p ./",
"package": "trae-cli package",
"publish": "trae-cli publish"
}
}最佳实践
性能优化
延迟加载
typescript// 延迟加载重型依赖 async function loadHeavyDependency() { const { heavyModule } = await import('./heavy-module'); return heavyModule; }适当的激活事件
json{ "activationEvents": [ "onLanguage:typescript", // 仅在打开 TypeScript 文件时激活 "onCommand:myExtension.specificCommand" // 仅在执行特定命令时激活 ] }资源清理
typescriptexport function activate(context: TraeAPI.ExtensionContext) { const disposable = TraeAPI.workspace.onDidChangeTextDocument(() => { // 处理文档变化 }); // 确保在扩展停用时清理资源 context.subscriptions.push(disposable); }
用户体验
提供进度指示
typescriptTraeAPI.window.withProgress({ location: TraeAPI.ProgressLocation.Notification, title: '正在处理...', cancellable: true }, async (progress, token) => { for (let i = 0; i < 100; i++) { if (token.isCancellationRequested) { break; } progress.report({ increment: 1, message: `步骤 ${i + 1}/100` }); await new Promise(resolve => setTimeout(resolve, 100)); } });错误处理和用户反馈
typescripttry { await performOperation(); TraeAPI.window.showInformationMessage('操作成功完成!'); } catch (error) { TraeAPI.window.showErrorMessage(`操作失败: ${error.message}`); }
安全性
输入验证
typescriptfunction validateInput(input: string): boolean { // 验证用户输入 return /^[a-zA-Z0-9_-]+$/.test(input); }安全存储
typescript// 使用 SecretStorage 存储敏感信息 await context.secrets.store('apiToken', userToken);
迁移指南
从 VS Code 扩展迁移
大多数 VS Code 扩展可以直接在 Trae IDE 中运行,只需要少量修改:
更新 package.json
json{ "engines": { "trae": "^1.0.0" // 替换 "vscode": "^1.x.x" } }更新导入语句
typescript// 旧的 import * as vscode from 'vscode'; // 新的 import * as TraeAPI from '@trae/api';利用 Trae 特有功能
typescript// 使用 AI 功能 const aiResponse = await TraeAPI.ai.generateCode({ prompt: '创建一个 React 组件', language: 'typescript' });
示例
完整的扩展示例
typescript
// src/extension.ts
import * as TraeAPI from '@trae/api';
interface TodoItem {
id: string;
text: string;
completed: boolean;
}
class TodoProvider implements TraeAPI.TreeDataProvider<TodoItem> {
private _onDidChangeTreeData = new TraeAPI.EventEmitter<TodoItem | undefined | null | void>();
readonly onDidChangeTreeData = this._onDidChangeTreeData.event;
private todos: TodoItem[] = [];
getTreeItem(element: TodoItem): TraeAPI.TreeItem {
const item = new TraeAPI.TreeItem(element.text, TraeAPI.TreeItemCollapsibleState.None);
item.id = element.id;
item.description = element.completed ? '已完成' : '待完成';
item.contextValue = element.completed ? 'completedTodo' : 'pendingTodo';
return item;
}
getChildren(element?: TodoItem): Thenable<TodoItem[]> {
return Promise.resolve(this.todos);
}
addTodo(text: string): void {
const todo: TodoItem = {
id: Date.now().toString(),
text,
completed: false
};
this.todos.push(todo);
this._onDidChangeTreeData.fire();
}
toggleTodo(id: string): void {
const todo = this.todos.find(t => t.id === id);
if (todo) {
todo.completed = !todo.completed;
this._onDidChangeTreeData.fire();
}
}
deleteTodo(id: string): void {
this.todos = this.todos.filter(t => t.id !== id);
this._onDidChangeTreeData.fire();
}
}
export function activate(context: TraeAPI.ExtensionContext) {
const todoProvider = new TodoProvider();
// 注册树视图
const treeView = TraeAPI.window.createTreeView('todoList', {
treeDataProvider: todoProvider,
showCollapseAll: false
});
// 注册命令
const commands = [
TraeAPI.commands.registerCommand('todoExtension.addTodo', async () => {
const text = await TraeAPI.window.showInputBox({
prompt: '输入待办事项',
placeHolder: '例如:完成项目文档'
});
if (text) {
todoProvider.addTodo(text);
}
}),
TraeAPI.commands.registerCommand('todoExtension.toggleTodo', (item: TodoItem) => {
todoProvider.toggleTodo(item.id);
}),
TraeAPI.commands.registerCommand('todoExtension.deleteTodo', (item: TodoItem) => {
todoProvider.deleteTodo(item.id);
})
];
// 添加到订阅
context.subscriptions.push(treeView, ...commands);
// 状态栏项目
const statusBarItem = TraeAPI.window.createStatusBarItem(
TraeAPI.StatusBarAlignment.Left,
100
);
statusBarItem.text = '$(checklist) 待办事项';
statusBarItem.command = 'todoExtension.addTodo';
statusBarItem.show();
context.subscriptions.push(statusBarItem);
}
export function deactivate() {
// 清理资源
}