MonkeyCode 插件开发实战:5步创建你的第一个AI编程插件
MonkeyCode 的插件系统让开发者可以扩展平台能力。无论是添加新的代码模板、集成第三方服务、还是定制AI行为,插件系统都能满足。
本文通过一个实际案例,手把手教你开发MonkeyCode插件。
插件能做什么?
MonkeyCode 插件可以:
- 扩展AI的Prompt模板
- 添加自定义代码生成器
- 集成第三方工具和服务
- 自定义工作流步骤
- 添加新的代码检查规则
开发环境准备
# 1. 克隆插件模板\ngit clone https://github.com/chaitin/monkeycode-plugin-template.git\nmv monkeycode-plugin-template my-first-plugin\ncd my-first-plugin\n\n# 2. 安装依赖\nnpm install\n\n# 3. 目录结构\nmy-first-plugin/\n├── package.json # 插件元信息\n├── src/\n│ ├── index.ts # 入口文件\n│ ├── commands/ # 命令定义\n│ ├── templates/ # 代码模板\n│ └── hooks/ # 钩子函数\n├── README.md # 插件文档\n└── test/ # 测试5步创建插件:代码片段生成器
我们将创建一个插件,为AI提供团队自定义的代码片段模板。
Step 1: 配置插件信息
// package.json\n{\n "name": "monkeycode-plugin-team-snippets",\n "version": "1.0.0",\n "description": "团队代码片段模板",\n "monkeycode": {\n "minVersion": "1.5.0",\n "type": "template-provider",\n "permissions": ["read:workspace"]\n },\n "main": "dist/index.js"\n}Step 2: 定义代码模板
// src/templates/crud-api.ts\nexport const crudApiTemplate = {\n name: "CRUD API Generator",\n description: "生成标准的CRUD API接口",\n language: "typescript",\n framework: "express",\n \n parameters: [\n { name: "modelName", type: "string", description: "模型名称" },\n { name: "fields", type: "Field[]", description: "字段定义" },\n { name: "authRequired", type: "boolean", default: true }\n ],\n \n generate: (params) => {\n const { modelName, fields, authRequired } = params;\n return `\nimport { Router } from "express";\nimport { ${modelName} } from "../models/${modelName}";\n\nconst router = Router();\n${authRequired ? 'import { authMiddleware } from "../middleware/auth";' : ""}\n\n// 获取列表\nrouter.get("/"${authRequired ? ", authMiddleware" : ""}, async (req, res) => {\n const items = await ${modelName}.findMany({\n where: buildFilter(req.query),\n ...buildPagination(req.query)\n });\n res.json({ data: items, total: await ${modelName}.count() });\n});\n\n// 获取详情\nrouter.get("/:id"${authRequired ? ", authMiddleware" : ""}, async (req, res) => {\n const item = await ${modelName}.findUnique({ where: { id: req.params.id } });\n if (!item) return res.status(404).json({ error: "Not found" });\n res.json(item);\n});\n\n// 创建\nrouter.post("/"${authRequired ? ", authMiddleware" : ""}, async (req, res) => {\n const item = await ${modelName}.create({ data: req.body });\n res.status(201).json(item);\n});\n\n// 更新\nrouter.put("/:id"${authRequired ? ", authMiddleware" : ""}, async (req, res) => {\n const item = await ${modelName}.update({\n where: { id: req.params.id },\n data: req.body\n });\n res.json(item);\n});\n\n// 删除\nrouter.delete("/:id"${authRequired ? ", authMiddleware" : ""}, async (req, res) => {\n await ${modelName}.delete({ where: { id: req.params.id } });\n res.status(204).send();\n});\n\nexport default router;\n`;\n }\n};Step 3: 注册插件钩子
// src/hooks/index.ts\nimport { PluginContext } from "monkeycode-plugin-sdk";\nimport { crudApiTemplate } from "../templates/crud-api";\n\nexport function registerHooks(context: PluginContext) {\n // 注册模板提供者\n context.registerTemplateProvider({\n id: "team-crud-api",\n name: "团队标准CRUD API",\n templates: [crudApiTemplate],\n \n // 匹配条件:当AI需要创建API时推荐使用此模板\n matchCondition: (task) => {\n return task.description.includes("API") || \n task.description.includes("接口");\n }\n });\n \n // 注册AI Prompt增强\n context.registerPromptEnhancer({\n id: "team-standards",\n enhance: (originalPrompt, task) => {\n return originalPrompt + "\\n\\n请遵循以下团队规范:\\n" +\n "- 使用Express + TypeScript\\n" +\n "- 错误响应格式: { code, message, details }\\n" +\n "- 使用Prisma ORM\\n" +\n "- 所有接口需要分页支持";\n }\n });\n}Step 4: 编写入口文件
// src/index.ts\nimport { registerHooks } from "./hooks";\n\nexport function activate(context: PluginContext) {\n console.log("Team Snippets 插件已激活");\n registerHooks(context);\n}\n\nexport function deactivate() {\n console.log("Team Snippets 插件已停用");\n}Step 5: 测试和发布
# 运行测试\nnpm test\n\n# 构建\nnpm run build\n\n# 本地测试\n# 将插件目录链接到 MonkeyCode 的插件目录\nln -s $(pwd) ~/.monkeycode/plugins/team-snippets\n\n# 发布到 MonkeyCode 插件市场\nnpx monkeycode publish插件API参考
TemplateProvider
interface TemplateProvider {\n id: string;\n name: string;\n templates: CodeTemplate[];\n matchCondition?: (task: Task) => boolean;\n}\n\ninterface CodeTemplate {\n name: string;\n description: string;\n language: string;\n framework?: string;\n parameters: Parameter[];\n generate: (params: Record<string, any>) => string;\n}PromptEnhancer
interface PromptEnhancer {\n id: string;\n enhance: (prompt: string, task: Task) => string;\n}Hook点
| 钩子 | 触发时机 | 用途 |
|---|---|---|
| onTaskCreate | 任务创建时 | 自动添加标签、分配模板 |
| onBeforeCodegen | AI生成代码前 | 注入团队规范、选择模板 |
| onAfterCodegen | AI生成代码后 | 自动格式化、Lint修复 |
| onBeforeCommit | Git提交前 | 代码检查、安全扫描 |
| onTaskComplete | 任务完成时 | 通知、统计 |
进阶:多团队插件管理
企业场景中,不同团队可能有不同的插件配置:
// 管理后台配置\n{\n "backend-team": {\n plugins: ["team-crud-api", "team-db-migration"],\n aiModel: "deepseek-v3",\n codeStyle: "pep8"\n },\n "frontend-team": {\n plugins: ["team-react-component", "team-css-modules"],\n aiModel: "glm-4",\n codeStyle: "prettier"\n }\n}总结
MonkeyCode的插件系统让团队可以将自己的编码规范、常用模板和最佳实践固化到平台中。AI不再是"通用助手",而是"了解你团队的专属助手"。5步就能创建一个插件,快去试试吧。
插件开发文档:monkeycode.docs.baizhi.cloud/plugins
插件模板仓库:github.com/chaitin/monkeycode-plugin-template
GitHub:github.com/chaitin/MonkeyCode