第十六章:扩展性设计

第十六章:扩展性设计

🔧 本章介绍 MiniClaw 的扩展机制,包括技能、工具和提示词的扩展方式。


16.1 技能扩展

16.1.1 新技能创建流程

┌─────────────────────────────────────────────────────────────────────┐
│                    技能创建流程                                      │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  步骤 1:创建技能目录                                               │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  mkdir -p ~/.miniclaw/skills/my-skill                      │   │
│  │  cd ~/.miniclaw/skills/my-skill                            │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  步骤 2:创建 SKILL.md 文件                                         │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  ---                                                        │   │
│  │  name: my-skill                                             │   │
│  │  description: "我的自定义技能"                               │   │
│  │  prompts:                                                   │   │
│  │    - name: help                                             │   │
│  │      description: "显示帮助信息"                             │   │
│  │  tools:                                                     │   │
│  │    - name: do_something                                     │   │
│  │      description: "执行某个操作"                             │   │
│  │  ---                                                        │   │
│  │                                                             │   │
│  │  # My Skill                                                 │   │
│  │                                                             │   │
│  │  这是一个自定义技能的详细说明...                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  步骤 3:验证技能加载                                               │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  # 重启 MCP 客户端或等待缓存过期                             │   │
│  │  # 使用 miniclaw_status 检查技能是否加载                    │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

16.1.2 技能元数据定义

┌─────────────────────────────────────────────────────────────────────┐
│                    技能元数据定义                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  SKILL.md Frontmatter 结构:                                        │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  ---                                                        │   │
│  │  # 必需字段                                                  │   │
│  │  name: string           # 技能名称(唯一标识)               │   │
│  │  description: string    # 技能描述                          │   │
│  │                                                             │   │
│  │  # 可选字段                                                  │   │
│  │  prompts:                  # 提示词声明列表                  │   │
│  │    - name: string         # 提示词名称                       │   │
│  │      description: string  # 提示词描述                       │   │
│  │                                                             │   │
│  │  tools:                    # 工具声明列表                    │   │
│  │    - name: string         # 工具名称                         │   │
│  │      description: string  # 工具描述                         │   │
│  │      inputSchema: object  # 输入参数 Schema                  │   │
│  │                                                             │   │
│  │  resources:                # 资源声明列表                    │   │
│  │    - uri: string          # 资源 URI                         │   │
│  │      name: string         # 资源名称                         │   │
│  │      description: string  # 资源描述                         │   │
│  │                                                             │   │
│  │  exec: string             # 可执行脚本路径                   │   │
│  │  context: string          # 上下文钩子文件                   │   │
│  │  ---                                                        │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  完整示例:                                                         │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  ---                                                        │   │
│  │  name: git-helper                                           │   │
│  │  description: "Git 操作辅助技能"                             │   │
│  │  prompts:                                                   │   │
│  │    - name: commit_guide                                     │   │
│  │      description: "提交信息编写指南"                         │   │
│  │    - name: branch_strategy                                  │   │
│  │      description: "分支策略建议"                             │   │
│  │  tools:                                                     │   │
│  │    - name: analyze_diff                                     │   │
│  │      description: "分析代码差异"                             │   │
│  │  resources:                                                 │   │
│  │    - uri: git-helper://conventions                          │   │
│  │      name: "Git 规范"                                       │   │
│  │  ---                                                        │   │
│  │                                                             │   │
│  │  # Git Helper Skill                                         │   │
│  │                                                             │   │
│  │  提供Git操作的辅助功能...                                    │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

16.1.3 可执行技能开发

┌─────────────────────────────────────────────────────────────────────┐
│                    可执行技能开发                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  目录结构:                                                         │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  ~/.miniclaw/skills/backup/                                 │   │
│  │  ├── SKILL.md              # 技能定义                        │   │
│  │  ├── backup.sh             # 可执行脚本                      │   │
│  │  └── references/           # 参考文件                        │   │
│  │      └── config.json                                        │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  SKILL.md 配置:                                                    │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  ---                                                        │   │
│  │  name: backup                                               │   │
│  │  description: "项目备份技能"                                 │   │
│  │  exec: ./backup.sh          # 指定执行脚本                   │   │
│  │  tools:                                                     │   │
│  │    - name: run_backup                                       │   │
│  │      description: "执行备份操作"                             │   │
│  │  ---                                                        │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  backup.sh 脚本:                                                   │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  #!/bin/bash                                                │   │
│  │                                                             │   │
│  │  # 获取参数                                                 │   │
│  │  ACTION=$1                                                  │   │
│  │  TARGET=$2                                                  │   │
│  │                                                             │   │
│  │  case $ACTION in                                            │   │
│  │    "create")                                                │   │
│  │      tar -czf "backup_$(date +%Y%m%d).tar.gz" "$TARGET"     │   │
│  │      echo "Backup created successfully"                     │   │
│  │      ;;                                                     │   │
│  │    "list")                                                  │   │
│  │      ls -la backup_*.tar.gz                                 │   │
│  │      ;;                                                     │   │
│  │    *)                                                       │   │
│  │      echo "Unknown action: $ACTION"                         │   │
│  │      ;;                                                     │   │
│  │  esac                                                       │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

16.2 工具扩展

16.2.1 核心工具添加

┌─────────────────────────────────────────────────────────────────────┐
│                    核心工具添加                                      │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  在 src/index.ts 中添加新工具:                                     │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                                                             │   │
│  │  // 1. 定义工具 Schema                                      │   │
│  │  const MyToolSchema = z.object({                            │   │
│  │    param1: z.string().describe('参数1说明'),                 │   │
│  │    param2: z.number().optional().describe('参数2说明'),      │   │
│  │  });                                                        │   │
│  │                                                             │   │
│  │  // 2. 在 ListToolsRequestSchema 中注册                     │   │
│  │  server.setRequestHandler(ListToolsRequestSchema, async () => {│
│  │    return {                                                 │   │
│  │      tools: [                                               │   │
│  │        // ... 现有工具                                       │   │
│  │        {                                                    │   │
│  │          name: "miniclaw_my_tool",                          │   │
│  │          description: "我的自定义工具",                      │   │
│  │          inputSchema: {                                     │   │
│  │            type: "object",                                  │   │
│  │            properties: {                                    │   │
│  │              param1: { type: "string", description: "..." },│   │
│  │              param2: { type: "number", description: "..." },│   │
│  │            },                                               │   │
│  │            required: ["param1"],                            │   │
│  │          },                                                 │   │
│  │        },                                                   │   │
│  │      ],                                                     │   │
│  │    };                                                       │   │
│  │  });                                                        │   │
│  │                                                             │   │
│  │  // 3. 在 CallToolRequestSchema 中实现                      │   │
│  │  server.setRequestHandler(CallToolRequestSchema, async (req) => {│
│  │    const { name, arguments: args } = req.params;            │   │
│  │                                                             │   │
│  │    switch (name) {                                          │   │
│  │      case "miniclaw_my_tool": {                             │   │
│  │        const { param1, param2 } = MyToolSchema.parse(args); │   │
│  │        const result = await kernel.myTool(param1, param2);  │   │
│  │        return {                                             │   │
│  │          content: [{ type: "text", text: result }],         │   │
│  │        };                                                   │   │
│  │      }                                                      │   │
│  │      // ... 其他工具                                         │   │
│  │    }                                                        │   │
│  │  });                                                        │   │
│  │                                                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

16.2.2 动态工具注册

┌─────────────────────────────────────────────────────────────────────┐
│                    动态工具注册                                      │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  技能工具自动发现机制:                                             │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                                                             │   │
│  │  // 在 ListToolsRequestSchema 中动态添加技能工具            │   │
│  │  server.setRequestHandler(ListToolsRequestSchema, async () => {│
│  │    const baseTools = [                                      │   │
│  │      // 核心工具列表...                                      │   │
│  │    ];                                                       │   │
│  │                                                             │   │
│  │    // 动态发现技能工具                                       │   │
│  │    const skillTools = await kernel.discoverSkillTools();    │   │
│  │                                                             │   │
│  │    // 合并工具列表                                           │   │
│  │    const allTools = [...baseTools, ...skillTools.map(t => ({│   │
│  │      name: `skill_${t.skillName}_${t.name}`,                │   │
│  │      description: t.description,                            │   │
│  │      inputSchema: t.inputSchema,                            │   │
│  │    }))];                                                    │   │
│  │                                                             │   │
│  │    return { tools: allTools };                              │   │
│  │  });                                                        │   │
│  │                                                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  技能工具命名规范:                                                 │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  skill_{skillName}_{toolName}                               │   │
│  │                                                             │   │
│  │  示例:                                                      │   │
│  │  • skill_git-helper_analyze_diff                            │   │
│  │  • skill_backup_run_backup                                  │   │
│  │  • skill_code-review_check_style                            │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

16.3 提示词扩展

16.3.1 核心提示词添加

┌─────────────────────────────────────────────────────────────────────┐
│                    核心提示词添加                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  在 src/index.ts 中添加新提示词:                                   │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                                                             │   │
│  │  // 1. 在 ListPromptsRequestSchema 中注册                   │   │
│  │  server.setRequestHandler(ListPromptsRequestSchema, async () => {│
│  │    return {                                                 │   │
│  │      prompts: [                                             │   │
│  │        // ... 现有提示词                                     │   │
│  │        {                                                    │   │
│  │          name: "miniclaw_my_prompt",                        │   │
│  │          description: "我的自定义提示词",                    │   │
│  │        },                                                   │   │
│  │      ],                                                     │   │
│  │    };                                                       │   │
│  │  });                                                        │   │
│  │                                                             │   │
│  │  // 2. 在 GetPromptRequestSchema 中实现                     │   │
│  │  server.setRequestHandler(GetPromptRequestSchema, async (req) => {│
│  │    const { name } = req.params;                             │   │
│  │                                                             │   │
│  │    switch (name) {                                          │   │
│  │      case "miniclaw_my_prompt":                             │   │
│  │        return {                                             │   │
│  │          messages: [{                                       │   │
│  │            role: "user",                                    │   │
│  │            content: {                                       │   │
│  │              type: "text",                                  │   │
│  │              text: generateMyPrompt(),                      │   │
│  │            },                                               │   │
│  │          }]                                                 │   │
│  │        };                                                   │   │
│  │      // ... 其他提示词                                       │   │
│  │    }                                                        │   │
│  │  });                                                        │   │
│  │                                                             │   │
│  │  // 3. 提示词生成函数                                        │   │
│  │  function generateMyPrompt(): string {                      │   │
│  │    return `# 我的提示词                                      │   │
│  │                                                             │   │
│  │  请按照以下步骤执行:                                        │   │
│  │  1. 第一步...                                               │   │
│  │  2. 第二步...                                               │   │
│  │  `;                                                         │   │
│  │  }                                                          │   │
│  │                                                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

16.3.2 动态提示词注册

┌─────────────────────────────────────────────────────────────────────┐
│                    动态提示词注册                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  技能提示词自动发现机制:                                           │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                                                             │   │
│  │  // 在 ListPromptsRequestSchema 中动态添加技能提示词        │   │
│  │  server.setRequestHandler(ListPromptsRequestSchema, async () => {│
│  │    const basePrompts = [                                    │   │
│  │      // 核心提示词列表...                                    │   │
│  │    ];                                                       │   │
│  │                                                             │   │
│  │    // 动态发现技能提示词                                     │   │
│  │    const skillPrompts = await kernel.discoverSkillPrompts();│   │
│  │                                                             │   │
│  │    // 合并提示词列表                                         │   │
│  │    const allPrompts = [...basePrompts, ...skillPrompts.map(p => ({│
│  │      name: `skill_${p.skillName}_${p.name}`,                │   │
│  │      description: p.description,                            │   │
│  │    }))];                                                    │   │
│  │                                                             │   │
│  │    return { prompts: allPrompts };                          │   │
│  │  });                                                        │   │
│  │                                                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  技能提示词命名规范:                                               │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  skill_{skillName}_{promptName}                             │   │
│  │                                                             │   │
│  │  示例:                                                      │   │
│  │  • skill_git-helper_commit_guide                            │   │
│  │  • skill_git-helper_branch_strategy                         │   │
│  │  • skill_code-review_check_list                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

16.4 扩展架构图

┌─────────────────────────────────────────────────────────────────────┐
│                    扩展架构图                                        │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│                        ┌─────────────────┐                          │
│                        │   MCP Client    │                          │
│                        └────────┬────────┘                          │
│                                 │                                   │
│                                 ▼                                   │
│  ┌──────────────────────────────────────────────────────────────┐  │
│  │                      MiniClaw Core                            │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐           │  │
│  │  │   Tools     │  │  Prompts    │  │  Resources  │           │  │
│  │  │  (核心工具) │  │ (核心提示词)│  │ (核心资源)  │           │  │
│  │  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘           │  │
│  │         │                │                │                   │  │
│  │         └────────────────┼────────────────┘                   │  │
│  │                          │                                    │  │
│  │                          ▼                                    │  │
│  │              ┌─────────────────────┐                          │  │
│  │              │    Skill Scanner    │                          │  │
│  │              │   (技能发现机制)     │                          │  │
│  │              └──────────┬──────────┘                          │  │
│  │                         │                                     │  │
│  └─────────────────────────┼─────────────────────────────────────┘  │
│                            │                                        │
│                            ▼                                        │
│  ┌──────────────────────────────────────────────────────────────┐  │
│  │                    Skills Directory                           │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐           │  │
│  │  │  git-helper │  │   backup    │  │ code-review │  ...      │  │
│  │  │  SKILL.md   │  │  SKILL.md   │  │  SKILL.md   │           │  │
│  │  │  *.sh       │  │  *.sh       │  │  refs/      │           │  │
│  │  └─────────────┘  └─────────────┘  └─────────────┘           │  │
│  └──────────────────────────────────────────────────────────────┘  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

本章小结

┌─────────────────────────────────────────────────────────────────────┐
│                     第十六章 核心要点                                │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  🔧 技能扩展                                                        │
│     • 创建目录:~/.miniclaw/skills/{skill-name}/                   │
│     • 定义 SKILL.md(Frontmatter + 内容)                          │
│     • 可执行脚本支持                                                │
│                                                                     │
│  🛠️ 工具扩展                                                        │
│     • 核心工具:修改 src/index.ts                                   │
│     • 动态工具:技能自动发现                                        │
│     • 命名规范:skill_{skill}_{tool}                               │
│                                                                     │
│  📝 提示词扩展                                                      │
│     • 核心提示词:修改 src/index.ts                                 │
│     • 动态提示词:技能自动发现                                      │
│     • 命名规范:skill_{skill}_{prompt}                             │
│                                                                     │
│  🏗️ 扩展架构                                                       │
│     • Skill Scanner 自动发现                                        │
│     • 统一注册机制                                                  │
│     • 插件化设计                                                    │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

下一章:与 OpenClaw 的关系 →

← 返回目录