MonkeyCode IDE插件开发指南:从零构建VSCode/JetBrains插件
🎯 为什么需要IDE插件?
MonkeyCode开源后,最直接的交互方式就是通过IDE插件。本文将手把手教你如何从零开始为MonkeyCode开发VSCode和JetBrains插件,让AI编程能力深度集成到你的开发工作流中。
IDE插件的核心价值
| 特性 | 命令行 | Web IDE | 原生插件 |
|---|---|---|---|
| 代码补全 | ❌ | ⚠️延迟高 | ✅ 实时 |
| 上下文感知 | ❌ | ⚠️有限 | ✅ 完整 |
| 快捷键绑定 | ❌ | ⚠️受限 | ✅ 自由 |
| 离线使用 | ✅ | ❌ | ✅ |
| 深度集成 | ❌ | ⚠️ | ✅ |
📦 第一部分:VSCode插件开发
1.1 项目初始化
# 安装VSCode插件开发工具
npm install -g yo generator-code
# 使用脚手架创建项目
yo code
# 选择以下选项:
# ? What type of extension do you want to create? New Extension (TypeScript)
# ? What's the name of your extension? MonkeyCode
# ? What's the identifier? monkeycode
# ? Description? AI Programming Assistant by MonkeyCode
# ? Initialize a Git repository? Yes
# ? Bundle the source code with webpack? Yes
# ? Which package manager to use? npm
1.2 项目结构
monkeycode-vscode/
├── src/
│ ├── extension.ts # 插件入口
│ ├── commands/
│ │ ├── complete.ts # 代码补全
│ │ ├── explain.ts # 代码解释
│ │ ├── generate.ts # 代码生成
│ │ ├── fix.ts # Bug修复
│ │ └── test.ts # 测试生成
│ ├── provider/
│ │ ├── InlineCompletionItemProvider.ts
│ │ ├── HoverProvider.ts
│ │ └── CodeActionProvider.ts
│ ├── service/
│ │ ├── MonkeyCodeAPI.ts # API调用封装
│ │ ├── ConfigManager.ts # 配置管理
│ │ └── Telemetry.ts # 遥测上报
│ └── utils/
│ ├── parser.ts # 代码解析
│ └── context.ts # 上下文收集
├── package.json # 插件清单
├── tsconfig.json
├── webpack.config.js
└── README.md
1.3 核心功能实现
功能一:智能代码补全(Inline Completion)
// src/provider/InlineCompletionItemProvider.ts
import * as vscode from 'vscode';
import { MonkeyCodeAPI } from '../service/MonkeyCodeAPI';
export class MonkeyCodeCompletionProvider
implements vscode.InlineCompletionItemProvider {
private api: MonkeyCodeAPI;
constructor(api: MonkeyCodeAPI) {
this.api = api;
}
public async provideInlineCompletionItems(
document: vscode.TextDocument,
position: vscode.Position,
context: vscode.InlineCompletionContext,
token: vscode.CancellationToken
): Promise<vscode.InlineCompletionItem[]> {
// 获取当前文件内容作为上下文
const textBeforeCursor = document.getText(
new vscode.Range(new vscode.Position(0, 0), position)
);
// 获取当前行的缩进
const lineText = document.lineAt(position.line).text;
const indent = lineText.match(/^\s*/)?.[0] || '';
try {
// 调用MonkeyCode API获取补全建议
const completion = await this.api.getCodeCompletion({
filename: document.fileName,
language: document.languageId,
code: textBeforeCursor,
cursorLine: position.line,
cursorChar: position.character,
});
if (completion && completion.text) {
// 处理缩进
const indentedText = completion.text
.split('\n')
.map((line, i) => i === 0 ? line : indent + line)
.join('\n');
return [new vscode.InlineCompletionItem(indentedText)];
}
} catch (error) {
console.error('MonkeyCode completion error:', error);
}
return [];
}
}
功能二:代码解释(Hover提示)
// src/provider/HoverProvider.ts
import * as vscode from 'vscode';
import { MonkeyCodeAPI } from '../service/MonkeyCodeAPI';
export class MonkeyCodeHoverProvider implements vscode.HoverProvider {
private api: MonkeyCodeAPI;
constructor(api: MonkeyCodeAPI) {
this.api = api;
}
public async provideHover(
document: vscode.TextDocument,
position: vscode.Position,
token: vscode.CancellationToken
): Promise<vscode.Hover | undefined> {
// 获取光标所在位置的单词或选中区域
const range = document.getWordRangeAtPosition(position)
|| new vscode.Range(position, position);
const selectedCode = document.getText(range);
// 如果选中的代码太短或太长,不触发
if (selectedCode.length < 3 || selectedCode.length > 500) {
return undefined;
}
try {
const explanation = await this.api.explainCode({
code: selectedCode,
language: document.languageId,
context: this.getSurroundingContext(document, position),
});
if (explanation) {
const markdown = new vscode.MarkdownString();
markdown.supportHtml = true;
markdown.appendMarkdown(`## 🤖 MonkeyCode 代码解读\n\n`);
markdown.appendMarkdown(explanation.summary);
markdown.appendMarkdown(`\n\n---\n*由 MonkeyCode AI 驱动*`);
return new vscode.Hover(markdown, range);
}
} catch (error) {
// 静默失败,不影响正常编码
}
return undefined;
}
private getSurroundingContext(
document: vscode.TextDocument,
position: vscode.Position
): string {
const startLine = Math.max(0, position.line - 10);
const endLine = Math.min(document.lineCount - 1, position.line + 5);
const range = new vscode.Range(
new vscode.Position(startLine, 0),
new vscode.Position(endLine, document.lineAt(endLine).text.length)
);
return document.getText(range);
}
}
功能三:代码操作命令面板
// src/extension.ts - 注册命令
import * as vscode from 'vscode';
import { MonkeyCodeAPI } from './service/MonkeyCodeAPI';
import { MonkeyCodeCompletionProvider } from './provider/InlineCompletionItemProvider';
import { MonkeyCodeHoverProvider } from './provider/HoverProvider';
let api: MonkeyCodeAPI;
let completionProvider: vscode.Disposable;
let hoverProvider: vscode.Disposable;
export function activate(context: vscode.ExtensionContext) {
console.log('MonkeyCode extension is now active!');
// 初始化API
api = new MonkeyCodeAPI(context);
// 注册代码补全
completionProvider = vscode.languages.registerInlineCompletionItemProvider(
{ pattern: '**' }, // 所有文件
new MonkeyCodeCompletionProvider(api)
);
context.subscriptions.push(completionProvider);
// 注册Hover解释
hoverProvider = vscode.languages.registerHoverProvider(
{ pattern: '**' },
new MonkeyCodeHoverProvider(api)
);
context.subscriptions.push(hoverProvider);
// 注册命令
registerCommands(context);
}
function registerCommands(context: vscode.ExtensionContext) {
// 生成代码
context.subscriptions.push(
vscode.commands.registerCommand('monkeycode.generate', async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const selection = editor.selection;
const selectedText = document.getText(selection);
const prompt = await vscode.window.showInputBox({
prompt: '描述你想要生成的代码',
placeHolder: '例如:实现一个快速排序算法'
});
if (prompt) {
const result = await api.generateCode({
prompt,
context: selectedText,
language: document.languageId
});
await editor.edit(editBuilder => {
editBuilder.replace(selection, result.code);
});
}
})
);
// 解释选中的代码
context.subscriptions.push(
vscode.commands.registerCommand('monkeycode.explain', async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const selection = editor.selection;
const selectedText = editor.document.getText(selection);
const explanation = await api.explainCode({
code: selectedText,
language: editor.document.languageId
});
// 在新面板中显示解释
const panel = vscode.window.createWebviewPanel(
'monkeycodeExplain',
'🤖 MonkeyCode 代码解读',
vscode.ViewColumn.Beside
);
panel.webview.html = createExplanationHTML(explanation);
})
);
// 修复Bug
context.subscriptions.push(
vscode.commands.registerCommand('monkeycode.fixBug', async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const selection = editor.selection;
const selectedText = editor.document.getText(selection);
const fix = await api.fixBug({
code: selectedText,
language: editor.document.languageId,
errorMessage: await vscode.window.showInputBox({
prompt: '描述遇到的错误信息'
}) || ''
});
// 显示diff供用户确认
await vscode.workspace.openTextDocument({
content: fix.fixedCode,
language: editor.document.languageId
});
})
);
// 生成单元测试
context.subscriptions.push(
vscode.commands.registerCommand('monkeycode.generateTest', async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const selection = editor.selection;
const selectedText = editor.document.getText(selection);
const testCode = await api.generateTest({
sourceCode: selectedText,
language: editor.document.languageId,
framework: await vscode.window.showQuickPick([
'Jest', 'Mocha', 'pytest', 'Go testing', 'JUnit'
], { placeHolder: '选择测试框架' }) || 'Jest'
});
// 创建新文件
const testFileName = editor.document.fileName
.replace(/\.\w+$/, '.test$&');
const uri = vscode.Uri.file(testFileName);
await vscode.workspace.writeFile(uri, Buffer.from(testCode));
const doc = await vscode.workspace.openTextDocument(uri);
await vscode.window.showTextDocument(doc);
})
);
}
export function deactivate() {
console.log('MonkeyCode extension deactivated');
}
1.4 package.json 配置
{
"name": "monkeycode",
"displayName": "MonkeyCode - AI编程助手",
"description": "基于MonkeyCode的AI编程助手,支持代码补全、解释、生成、修复等",
"version": "1.0.0",
"engines": {
"vscode": "^1.85.0"
},
"categories": [
"Programming Languages",
"Machine Learning",
"Snippets"
],
"activationEvents": [
"onLanguage:javascript",
"onLanguage:typescript",
"onLanguage:python",
"onLanguage:go",
"onLanguage:java",
"onLanguage:rust",
"onLanguage:csharp"
],
"main": "./dist/extension.js",
"contributes": {
"commands": [
{
"command": "monkeycode.generate",
"title": "🤖 MonkeyCode: 生成代码",
"category": "MonkeyCode"
},
{
"command": "monkeycode.explain",
"title": "🔍 MonkeyCode: 解释代码",
"category": "MonkeyCode"
},
{
"command": "monkeycode.fixBug",
"title": "🐛 MonkeyCode: 修复Bug",
"category": "MonkeyCode"
},
{
"command": "monkeycode.generateTest",
"title": "🧪 MonkeyCode: 生成测试",
"category": "MonkeyCode"
}
],
"keybindings": [
{
"command": "monkeycode.generate",
"key": "ctrl+shift+g",
"mac": "cmd+shift+g"
},
{
"command": "monkeycode.explain",
"key": "ctrl+shift+e",
"mac": "cmd+shift+e"
},
{
"command": "monkeycode.fixBug",
"key": "ctrl+shift+f",
"mac": "cmd+shift+f"
}
],
"configuration": {
"title": "MonkeyCode",
"properties": {
"monkeycode.apiEndpoint": {
"type": "string",
"default": "https://api.monkeycode.ai/v1",
"description": "MonkeyCode API地址"
},
"monkeycode.apiKey": {
"type": "string",
"default": "",
"description": "API密钥"
},
"monkeycode.model": {
"type": "string",
"enum": ["gpt-4o", "claude-3.5-sonnet", "local"],
"default": "gpt-4o",
"description": "使用的AI模型"
},
"monkeycode.enableAutoComplete": {
"type": "boolean",
"default": true,
"description": "启用自动代码补全"
},
"monkeycode.enableHoverExplain": {
"type": "boolean",
"default": true,
"description": "启用悬停代码解释"
},
"monkeycode.contextLines": {
"type": "number",
"default": 50,
"description": "发送给AI的上下文行数"
}
}
}
},
"scripts": {
"vscode:prepublish": "npm run compile",
"compile": "webpack --mode production",
"watch": "webpack --mode development --watch",
"test": "node ./out/runTest.js"
},
"devDependencies": {
"@types/vscode": "^1.85.0",
"@types/node": "^20.0.0",
"typescript": "^5.3.0",
"ts-loader": "^9.5.0",
"webpack": "^5.89.0",
"webpack-cli": "^5.1.0"
}
}
🧩 第二部分:JetBrains插件开发
2.1 项目初始化
# 使用IntelliJ Platform Plugin模板
# 方式一:通过IDEA创建
# File → New → Project → IntelliJ Platform Plugin
# 方式二:使用Gradle模板
git clone https://github.com/JetBrains/intellij-platform-plugin-template.git monkeycode-jetbrains
cd monkeycode-jetbrains
# 编辑 build.gradle.kts 配置插件信息
2.2 核心功能实现
// src/main/kotlin/com/monkeycode/MonkeyCodeAction.kt
package com.monkeycode
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.ui.Messages
import com.monkeycode.service.MonkeyCodeService
class MonkeyCodeGenerateAction : AnAction("MonkeyCode: 生成代码") {
override fun actionPerformed(e: AnActionEvent) {
val editor = e.getData(CommonDataKeys.EDITOR) ?: return
val project = e.project ?: return
val selectedText = editor.caretModel.currentCaret.selectedText ?: ""
// 弹出输入框获取用户意图
val prompt = Messages.showInputDialog(
project,
"描述你想要生成的代码:",
"🤖 MonkeyCode 代码生成",
null,
"",
null
) ?: return
// 调用MonkeyCode服务
val service = MonkeyCodeService.getInstance(project)
val result = service.generateCode(prompt, selectedText, project)
// 替换选中文本
runWriteCommandAction(project) {
editor.document.replaceString(
editor.selectionModel.selectionStart,
editor.selectionModel.selectionEnd,
result.code
)
}
}
}
class MonkeyCodeExplainAction : AnAction("MonkeyCode: 解释代码") {
override fun actionPerformed(e: AnActionEvent) {
val editor = e.getData(CommonDataKeys.EDITOR) ?: return
val project = e.project ?: return
val selectedText = editor.caretModel.currentCaret.selectedText ?: return
val service = MonkeyCodeService.getInstance(project)
val explanation = service.explainCode(selectedText, project)
// 在工具窗口中显示结果
val toolWindow = ToolWindowManager.getInstance(project)
.getToolWindow("MonkeyCode")
?: return
val content = toolWindow.contentManager.factory
.createContent(explanation.toHtml(), "", false)
toolWindow.contentManager.addContent(content)
toolWindow.show(null)
}
}
2.3 代码补全提供者
// src/main/kotlin/com/monkeycode/provider/MonkeyCodeCompletionContributor.kt
package com.monkeycode.provider
import com.intellij.codeInsight.completion.*
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.patterns.PlatformPatterns
import com.intellij.util.ProcessingContext
import com.monkeycode.service.MonkeyCodeService
class MonkeyCodeCompletionContributor : CompletionContributor() {
init {
extend(
CompletionType.BASIC,
PlatformPatterns.psiElement(),
MonkeyCodeCompletionProvider()
)
}
private class MonkeyCodeCompletionProvider : CompletionProvider<CompletionParameters>() {
override fun addCompletions(
parameters: CompletionParameters,
context: ProcessingContext,
resultSet: CompletionResultSet
) {
val editor = parameters.editor
val file = parameters.originalFile
val project = parameters.position.project
// 获取当前上下文
val offset = parameters.offset
val document = editor.document
val textBeforeCursor = document.charsSequence.subSequence(0, offset).toString()
// 异步调用MonkeyCode API
CompletableFuture.runAsync {
try {
val service = MonkeyCodeService.getInstance(project)
val completions = service.getCompletions(
textBeforeCursor,
file.language.id,
project
)
// 在EDT线程中添加补全项
ApplicationManager.getApplication().invokeLater {
completions.forEach { completion ->
resultSet.addElement(
LookupElementBuilder.create(completion.text)
.withIcon(MonkeyIcons.LOGO)
.withTypeText("MonkeyCode", true)
.withTailText(" AI Generated", true)
.withBoldness(true)
)
}
}
} catch (e: Exception) {
// 静默处理错误
}
}
}
}
}
2.4 plugin.xml 配置
<!-- src/main/resources/META-INF/plugin.xml -->
<idea-plugin>
<id>com.monkeycode</id>
<name>MonkeyCode - AI编程助手</name>
<vendor email="support@monkeycode.ai" url="https://monkeycode.ai">
MonkeyCode Team
</vendor>
<description><![CDATA[
<p>基于MonkeyCode开源项目的AI编程助手插件。</p>
<ul>
<li>🤖 智能代码补全</li>
<li>🔍 代码解释与分析</li>
<li>✨ 代码生成与重构</li>
<li>🐛 Bug自动修复</li>
<li>🧪 单元测试生成</li>
</ul>
<p>支持私有化部署,数据安全可控。</p>
]]></description>
<!-- 兼容性声明 -->
<depends>com.intellij.modules.platform</depends>
<!-- 扩展点注册 -->
<extensions defaultExtensionNs="com.intellij">
<!-- 代码补全 -->
<completion.contributor
language="any"
implementationClass="com.monkeycode.provider.MonkeyCodeCompletionContributor"/>
<!-- 工具窗口 -->
<toolWindow id="MonkeyCode"
secondary="true"
anchor="right"
factoryClass="com.monkeycode.toolwindow.MonkeyCodeToolWindowFactory"/>
<!-- 配置页面 -->
<applicationConfigurable
groupId="tools"
instance="com.monkeycode.config.MonkeyCodeConfigurable"
id="com.monkeycode.settings"
displayName="MonkeyCode"/>
<!-- 悬停提示 -->
<hoverProvider
implementationClass="com.monkeycode.provider.MonkeyCodeHoverProvider"/>
<!-- 代码检查 -->
<localInspection
language="JAVA"
displayName="MonkeyCode Suggestions"
groupName="MonkeyCode"
enabledByDefault="true"
level="WARNING"
implementationClass="com.monkeycode.inspection.MonkeyCodeInspection"/>
</extensions>
<!-- 动作注册 -->
<actions>
<group id="MonkeyCode.Actions" text="MonkeyCode" description="MonkeyCode AI Actions">
<action id="MonkeyCode.Generate"
class="com.monkeycode.MonkeyCodeGenerateAction"
text="生成代码"
description="使用AI生成代码">
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift G"/>
</action>
<action id="MonkeyCode.Explain"
class="com.monkeycode.MonkeyCodeExplainAction"
text="解释代码"
description="使用AI解释选中代码">
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift E"/>
</action>
<action id="MonkeyCode.FixBug"
class="com.monkeycode.MonkeyCodeFixBugAction"
text="修复Bug"
description="使用AI修复代码中的问题">
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift B"/>
</action>
<action id="MonkeyCode.Test"
class="com.monkeycode.MonkeyCodeGenerateTestAction"
text="生成测试"
description="使用AI生成单元测试">
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift T"/>
</action>
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
<add-to-group group-id="ToolsMenu" anchor="last"/>
</group>
</actions>
</idea-plugin>
🔗 第三部分:API服务层(共享)
通用API封装
// VSCode版本 - src/service/MonkeyCodeAPI.ts
export class MonkeyCodeAPI {
private endpoint: string;
private apiKey: string;
private model: string;
constructor(private context: vscode.ExtensionContext) {
const config = vscode.workspace.getConfiguration('monkeycode');
this.endpoint = config.get<string>('apiEndpoint')!;
this.apiKey = config.get<string>('apiKey')!;
this.model = config.get<string>('model')!;
}
async getCodeCompletion(params: CodeCompletionParams): Promise<CompletionResult> {
return this.post('/v1/code/complete', params);
}
async explainCode(params: ExplainParams): Promise<ExplanationResult> {
return this.post('/v1/code/explain', params);
}
async generateCode(params: GenerateParams): Promise<GenerateResult> {
return this.post('/v1/code/generate', params);
}
async fixBug(params: FixBugParams): Promise<FixResult> {
return this.post('/v1/code/fix', params);
}
async generateTest(params: TestParams): Promise<TestResult> {
return this.post('/v1/code/test', params);
}
private async post<T>(path: string, body: any): Promise<T> {
const response = await fetch(`${this.endpoint}${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.apiKey}`,
'X-Model': this.model,
'X-Plugin-Version': '1.0.0',
},
body: JSON.stringify(body),
});
if (!response.ok) {
throw new Error(`API Error: ${response.status} ${response.statusText}`);
}
return response.json();
}
}
🚀 第四步:调试与发布
本地调试
VSCode:
# 按F5启动调试
# 会打开一个新的Extension Development Host窗口
# 在该窗口中测试插件功能
JetBrains:
# 运行 runIde Gradle任务
./gradlew runIde
# 会启动一个新的IDE实例用于测试
发布到市场
VSCode Marketplace:
# 安装发布工具
npm install -g @vscode/vsce
# 打包
vsce package
# 发布(首次需要登录)
vsce publish
JetBrains Plugin Repository:
- 访问 https://plugins.jetbrains.com
- 登录并上传插件包
- 填写描述信息和截图
- 等待审核(通常1-3个工作日)
📊 性能优化技巧
1. 减少API调用频率
// 使用防抖(debounce)避免频繁调用
class DebouncedCompletion {
private debounceTimer: NodeJS.Timeout | null = null;
private lastResult: string = '';
public request(input: string, callback: (result: string) => void) {
if (this.debounceTimer) clearTimeout(this.debounceTimer);
this.debounceTimer = setTimeout(async () => {
// 缓存相同输入的结果
if (input === this.lastInput) {
callback(this.lastResult);
return;
}
const result = await this.callAPI(input);
this.lastInput = input;
this.lastResult = result;
callback(result);
}, 300); // 300ms防抖
}
2. 流式输出(Streaming)
async function streamCompletion(code: string): Promise<void> {
const response = await fetch('/api/stream', {
method: 'POST',
body: JSON.stringify({ code }),
});
const reader = response.body!.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
// 逐块更新UI,提升用户体验
updateEditorUI(chunk);
}
}
3. 智能缓存
class CompletionCache {
private cache = new Map<string, { result: string; timestamp: number }>();
private TTL = 5 * 60 * 1000; // 5分钟过期
get(key: string): string | null {
const item = this.cache.get(key);
if (!item) return null;
if (Date.now() - item.timestamp > this.TTL) {
this.cache.delete(key);
return null;
}
return item.result;
}
set(key: string, result: string): void {
this.cache.set(key, { result, timestamp: Date.now() });
}
}
🛠️ 开发调试常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 插件加载失败 | 依赖缺失 | npm install / gradle build |
| API调用超时 | 网络问题 | 检查endpoint配置,增加timeout |
| 补全不触发 | activationEvents配置错误 | 检查package.json/plugin.xml |
| 内存占用过高 | 上下文过大 | 减少contextLines配置 |
| 热重载不生效 | 缓存问题 | 清除~/.vscode/extensions后重启 |
🤝 参与贡献
MonkeyCode插件项目完全开源,欢迎贡献代码!
贡献方式:
- Fork仓库: https://github.com/monkeycode-ai/monkeycode
- 创建分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'feat: amazing feature' - 推送分支:
git push origin feature/amazing-feature - 提交PR: 在GitHub上创建Pull Request
特别需要的帮助:
- 🎨 UI/UX设计师 - 改进插件界面
- 🧪 测试工程师 - 编写更多测试用例
- 📝 文档作者 - 多语言文档翻译
- 🐛 Bug猎人 - 发现并报告问题
🔗 相关链接
| 资源 | 链接 |
|---|---|
| GitHub主仓库 | https://github.com/monkeycode-ai/monkeycode |
| VSCode插件源码 | plugins/vscode |
| JetBrains插件源码 | plugins/jetbrains |
| API文档 | https://docs.monkeycode.ai/api |
| 问题反馈 | https://github.com/monkeycode-ai/monkeycode/issues |
| 讨论区 | https://github.com/monkeycode-ai/monkeycode/discussions |
📢 总结
开发MonkeyCode IDE插件并不复杂,关键步骤:
- ✅ 理解插件架构 - VSCode Extension API / JetBrains Platform SDK
- ✅ 实现核心功能 - 补全、解释、生成、修复
- ✅ 调用MonkeyCode API - 统一的RESTful接口
- ✅ 优化用户体验 - 防抖、流式输出、缓存
- ✅ 发布到市场 - vsce publish / JetBrains Plugins
现在就开始开发你的第一个MonkeyCode插件吧!遇到任何问题都可以在GitHub提交Issue,我们会尽快帮你解决。
👉 GitHub Issue地址:https://github.com/monkeycode-ai/monkeycode/issues/new 👈
MonkeyCode团队 · 让每个开发者都拥有AI编程助手 · 开源 · 自由 · 共赢
浙公网安备 33010602011771号