foliko 2.0.5 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.claude/settings.local.json +4 -1
  2. package/.cli_default_systemPrompt.md +291 -0
  3. package/.editorconfig +56 -56
  4. package/.lintstagedrc +7 -7
  5. package/.prettierignore +29 -29
  6. package/.prettierrc +11 -11
  7. package/CLAUDE.md +3 -0
  8. package/Dockerfile +63 -63
  9. package/README.md +20 -3
  10. package/docs/architecture.md +34 -2
  11. package/docs/extensions.md +199 -0
  12. package/docs/migration.md +100 -0
  13. package/docs/public-api.md +280 -24
  14. package/docs/usage.md +122 -30
  15. package/install.ps1 +129 -129
  16. package/install.sh +121 -121
  17. package/package.json +1 -1
  18. package/plugins/core/audit/index.js +1 -1
  19. package/plugins/core/default/bootstrap.js +44 -19
  20. package/plugins/core/python-loader/index.js +43 -25
  21. package/plugins/core/skill-manager/PROMPT.md +6 -0
  22. package/plugins/core/skill-manager/index.js +402 -115
  23. package/plugins/core/sub-agent/PROMPT.md +10 -0
  24. package/plugins/core/sub-agent/index.js +36 -3
  25. package/plugins/core/think/index.js +1 -0
  26. package/plugins/core/workflow/index.js +82 -22
  27. package/plugins/executors/data-splitter/PROMPT.md +13 -0
  28. package/plugins/executors/data-splitter/index.js +5 -4
  29. package/plugins/executors/extension/extension-registry.js +145 -0
  30. package/plugins/executors/extension/index.js +405 -437
  31. package/plugins/executors/extension/prompt-builder.js +359 -0
  32. package/plugins/executors/extension/skill-helper.js +143 -0
  33. package/plugins/messaging/feishu/index.js +5 -3
  34. package/plugins/messaging/qq/index.js +6 -4
  35. package/plugins/messaging/telegram/index.js +6 -3
  36. package/plugins/messaging/weixin/index.js +5 -3
  37. package/plugins/tools/PROMPT.md +26 -0
  38. package/plugins/tools/index.js +6 -5
  39. package/skills/find-skills/SKILL.md +133 -133
  40. package/skills/foliko/AGENTS.md +196 -43
  41. package/skills/foliko/SKILL.md +157 -28
  42. package/skills/mcp/SKILL.md +77 -118
  43. package/skills/plugins/SKILL.md +89 -3
  44. package/skills/python/SKILL.md +57 -39
  45. package/skills/skill-guide/SKILL.md +42 -34
  46. package/skills/workflows/SKILL.md +224 -9
  47. package/skills/workflows/workflow-troubleshooting/SKILL.md +221 -281
  48. package/src/agent/chat.js +48 -27
  49. package/src/agent/main.js +34 -13
  50. package/src/agent/prompt-registry.js +56 -16
  51. package/src/agent/prompts/PROMPT.md +3 -0
  52. package/src/agent/sub.js +1 -1
  53. package/src/cli/ui/chat-ui-old.js +5 -2
  54. package/src/cli/ui/chat-ui.js +5 -2
  55. package/src/common/constants.js +12 -0
  56. package/src/common/error-capture.js +91 -0
  57. package/src/common/logger.js +2 -2
  58. package/src/context/compressor.js +6 -2
  59. package/src/executors/mcp-executor.js +105 -125
  60. package/src/framework/framework.js +23 -11
  61. package/src/index.js +4 -0
  62. package/src/plugin/base.js +908 -5
  63. package/src/plugin/manager.js +29 -8
  64. package/src/tool/schema.js +32 -9
  65. package/website/index.html +821 -0
package/README.md CHANGED
@@ -365,19 +365,36 @@ allowed-tools: tool1,tool2
365
365
 
366
366
  | 工具 | 说明 |
367
367
  | ---------------- | -------------------- |
368
- | `skill_load` | 加载技能 |
368
+ | `ext_call` | 调用扩展工具(普通扩展/MCP/Skill) |
369
+ | `ext_skill` | 查询扩展工具的参数结构 |
370
+ | `ext_list` | 列出所有扩展插件 |
371
+ | `skill_load` | 加载技能内容(SKILL.md) |
369
372
  | `list_plugins` | 列出所有插件 |
370
373
  | `list_tools` | 列出所有工具 |
371
374
  | `reload_plugins` | 重载插件 |
372
375
  | `shell_exec` | 执行 Shell 命令 |
373
- | `powershell` | 执行 PowerShell 命令 |
376
+ | `powershell` | 执行 PowerShell 命令 |
374
377
  | `py_execute` | 执行 Python 代码 |
375
378
  | `py_script` | 执行 Python 脚本 |
376
379
  | `py_pip_install` | 安装 Python 包 |
377
380
  | `install` | 安装 npm 包 |
378
- | `mcp_reload` | 重载 MCP 服务器 |
379
381
  | `audit_query` | 查询审计日志 |
380
382
 
383
+ ### MCP 管理工具
384
+
385
+ | 工具 | 说明 |
386
+ | ------------------- | --------------------------------- |
387
+ | `mcp_list_servers` | 列出所有 MCP 服务器及其工具 |
388
+ | `mcp_set_enabled` | 动态开启/关闭某个 MCP 服务器 |
389
+ | `mcp_reload` | 重载 MCP 配置(`.foliko/mcp_config.json`) |
390
+
391
+ > **统一扩展调用模式**:
392
+ > - 普通扩展:`ext_call({ plugin: "<name>", tool: "<tool>", args: {...} })`
393
+ > - MCP 服务器:`ext_call({ plugin: "mcp:<servername>", tool: "<tool>", args: {...} })`
394
+ > - Skill 命令:`ext_call({ plugin: "skill:<skillname>", tool: "<command>", args: { command: "..." } })`
395
+ > - 调用前先 `ext_skill({ plugin: "<name>" })` 查看参数结构
396
+ > - 普通扩展/MCP/Python:`args` 是结构化对象;Skill 命令:`args: { command: "..." }`
397
+
381
398
  ### 子 Agent 管理工具
382
399
 
383
400
  | 工具 | 说明 |
@@ -79,13 +79,45 @@ Tool Call Loop ◄────────────────────
79
79
 
80
80
  ToolRegistry.execute(name, args)
81
81
 
82
-
83
- Plugin Tool Handlers / SubAgent / Workflow
82
+ ├──► AI SDK 直调工具(plugin.tools / this.tool.register 注册)
83
+ ├──► ext_call({ plugin, tool, args })
84
+ │ │
85
+ │ ├──► 普通扩展(如 gate-trading)
86
+ │ ├──► MCP 服务器(plugin: 'mcp:<servername>')
87
+ │ └──► Skill 命令(plugin: 'skill:<skillname>')
84
88
 
85
89
 
86
90
  Result returned to LLM → Next iteration or final response
87
91
  ```
88
92
 
93
+ ## 扩展工具统一调度(ext_call / ext_skill)
94
+
95
+ 所有"非 AI SDK 直调"的工具通过 `ext_call` + `ext_skill` 统一管理:
96
+
97
+ | 扩展类型 | plugin 名 | 工具命名 | 命名空间 |
98
+ |---|---|---|---|
99
+ | 普通扩展 | `<plugin-name>` | `<plugin>_<tool>` 或自定义 | 全局 |
100
+ | MCP 服务器 | `mcp:<servername>` | MCP 原始工具名(无前缀) | `mcp:*` |
101
+ | Skill 命令 | `skill:<skillname>` | skill 命令名(无前缀) | `skill:*` |
102
+
103
+ ### 统一调用模式
104
+
105
+ ```js
106
+ // 1. 查询参数
107
+ ext_skill({ plugin: "<plugin-name>" })
108
+
109
+ // 2. 调用(结构化 Zod 参数)
110
+ ext_call({
111
+ plugin: "<plugin-name>",
112
+ tool: "<tool-name>",
113
+ args: { /* 结构化对象,与 Zod schema 对应 */ }
114
+ })
115
+ ```
116
+
117
+ ### 提示词结构
118
+
119
+ `ext_call` 工具的说明会出现在系统提示词的 `【Extensions】` 段落,每个扩展按 `mcp:*` / `skill:*` / 其他 分组列出。LLM 可通过 `ext_skill` 查询每个扩展的详细参数。
120
+
89
121
  ## 插件生命周期
90
122
 
91
123
  ```
@@ -0,0 +1,199 @@
1
+ # Extensions 扩展系统
2
+
3
+ Foliko 所有"非 AI SDK 直调"的工具(普通扩展、MCP 服务器、Skill 命令)都通过 **ext_call + ext_skill** 统一调度。
4
+
5
+ ## 1. 三种扩展命名空间
6
+
7
+ | 扩展类型 | plugin 名格式 | 工具名格式 | 示例 |
8
+ |---|---|---|---|
9
+ | 普通扩展 | `<plugin-name>` | 自定义 | `ext_call({plugin: "gate-trading", tool: "gate_get_balance"})` |
10
+ | MCP 服务器 | `mcp:<servername>` | MCP 原始工具名 | `ext_call({plugin: "mcp:designmd", tool: "search_design_kits"})` |
11
+ | Skill 命令 | `skill:<skillname>` | skill 命令名 | `ext_call({plugin: "skill:my-skill", tool: "greet"})` |
12
+ | Python 用户插件 | `python:<pluginname>` | 工具原始名(不带前缀) | `ext_call({plugin: "python:stock", tool: "get_price"})` |
13
+
14
+ ## 2. 统一调用模式
15
+
16
+ ### 2.1 查询参数(ext_skill)
17
+
18
+ ```js
19
+ // 普通扩展
20
+ ext_skill({ plugin: "gate-trading" })
21
+
22
+ // MCP 服务器
23
+ ext_skill({ plugin: "mcp:designmd" })
24
+
25
+ // Skill
26
+ ext_skill({ plugin: "skill:my-skill" })
27
+
28
+ // Python 用户插件
29
+ ext_skill({ plugin: "python:stock" })
30
+ ```
31
+
32
+ 返回内容:
33
+ - **普通扩展 / MCP**:每个工具的 Zod 参数 schema(通过 `zodSchemaToMarkdown` 渲染)
34
+ - **Skill**:技能详情(SKILL.md 内容)+ 各命令参数
35
+
36
+ ### 2.2 调用(ext_call)
37
+
38
+ ```js
39
+ ext_call({
40
+ plugin: "<plugin-name>",
41
+ tool: "<tool-name>",
42
+ args: { /* 结构化对象 */ }
43
+ })
44
+ ```
45
+
46
+ | 扩展类型 | args 格式 |
47
+ |---|---|
48
+ | 普通扩展 / MCP / Python | `args: {...}` 结构化对象 |
49
+ | Skill 命令 | `args: { command: "..." }` 命令行字符串 |
50
+
51
+ ## 3. MCP 服务器自动注册
52
+
53
+ MCP 启动后,每个 server 自动注册为 `mcp:<servername>` 扩展:
54
+
55
+ ```js
56
+ // mcp_config.json
57
+ {
58
+ "mcpServers": {
59
+ "designmd": {
60
+ "command": "npx",
61
+ "args": ["designmd-mcp"]
62
+ }
63
+ }
64
+ }
65
+
66
+ // 自动生成的扩展
67
+ {
68
+ name: "mcp:designmd",
69
+ description: "MCP 服务器 designmd 的工具集合",
70
+ tools: [
71
+ { name: "search_design_kits", description: "...", inputSchema: <Zod>, execute: ... },
72
+ { name: "get_design_kit", description: "...", ... },
73
+ ...
74
+ ]
75
+ }
76
+ ```
77
+
78
+ **优点**:
79
+ - 工具名是 MCP 原始名(无 `<server>_` 前缀)
80
+ - 参数从 JSON Schema 自动转 Zod(保留 required/optional 信息)
81
+ - LLM 通过 `ext_call` 统一调用,移除 `mcp_call` / `mcp_tool_schema` 特殊工具
82
+
83
+ ## 4. Skill 自动注册
84
+
85
+ 每个 skill 目录加载后,自动注册为 `skill:<skillname>` 扩展:
86
+
87
+ ```
88
+ .foliko/skills/my-skill/
89
+ ├── SKILL.md # 技能说明(YAML frontmatter + markdown)
90
+ └── index.js # 命令定义(可选)
91
+ ```
92
+
93
+ ### 4.1 命令格式(index.js)
94
+
95
+ ```js
96
+ module.exports = {
97
+ commands: [
98
+ {
99
+ name: 'greet',
100
+ description: '打招呼',
101
+ options: [
102
+ { flags: '-n, --name <name>', description: '姓名', required: true },
103
+ { flags: '-l, --lang <lang>', description: '语言', defaultValue: 'zh' },
104
+ { flags: '-s, --shout', description: '是否大声喊' },
105
+ ],
106
+ execute: async (args) => {
107
+ // args 是 commander.js 解析后的对象: { name: 'xxx', lang: 'zh', shout: false }
108
+ return `Hello, ${args.name}!`;
109
+ },
110
+ },
111
+ ],
112
+ };
113
+ ```
114
+
115
+ ### 4.2 LLM 调用
116
+
117
+ ```js
118
+ ext_call({
119
+ plugin: 'skill:my-skill',
120
+ tool: 'greet',
121
+ args: { command: "-n Claude -l en -s" }
122
+ })
123
+ ```
124
+
125
+ **args 传 `command` 字符串**,commander.js 解析后 handler 收到 `{ name: 'Claude', lang: 'en', shout: true }`。
126
+
127
+ ## 5. Plugin 基类:`this.skill` accessor
128
+
129
+ 任何 Plugin 都可程序化管理技能:
130
+
131
+ ```js
132
+ const { Plugin } = require('foliko');
133
+
134
+ class MyPlugin extends Plugin {
135
+ start(framework) {
136
+ super.start(framework);
137
+
138
+ // 注册
139
+ this.skill.register('my-skill', '# 说明', {
140
+ description: '...',
141
+ }, {
142
+ commands: [{
143
+ name: 'do', description: '...',
144
+ options: [{ flags: '-x <x>', required: true }],
145
+ execute: async (args) => ({ x: args.x }),
146
+ }],
147
+ });
148
+
149
+ // 查询
150
+ this.skill.has('my-skill');
151
+ this.skill.get('my-skill');
152
+ this.skill.details('my-skill');
153
+ this.skill.list();
154
+ this.skill.listOwned(); // 本插件注册的
155
+
156
+ // 直接执行
157
+ await this.skill.execute('my-skill:do', { x: 1 });
158
+
159
+ // 删除(reload 时不会复活)
160
+ this.skill.remove('my-skill');
161
+ }
162
+ }
163
+ ```
164
+
165
+ **生命周期**(基类自动处理):
166
+ - `install`/`start`/`reload` → 自动注册 / 重新注册
167
+ - `stop` → 自动移除
168
+ - `uninstall` → 完全清理
169
+
170
+ ## 6. 提示词结构
171
+
172
+ `【Extensions】扩展插件` 段落的结构:
173
+
174
+ ```
175
+ ## 【Extensions】扩展插件
176
+
177
+ **使用流程:**
178
+ 1. 调用 `ext_skill({ plugin: "<name>" })` 获取参数
179
+ 2. 根据返回参数用 `ext_call({ plugin, tool, args })` 调用
180
+
181
+ ### <plugin-name> ← 普通扩展
182
+ - `<tool>`: <desc>
183
+
184
+ ### mcp:<server> ← MCP 服务器
185
+ - `<tool>`: <desc>
186
+
187
+ ### skill:<name> ← Skill
188
+ - `<command>`: <desc>
189
+ ```
190
+
191
+ LLM 通过查看此段落发现可用的扩展工具,然后通过 `ext_skill` 获取详细参数。
192
+
193
+ ## 7. 迁移对照(旧 → 新)
194
+
195
+ | 旧 API | 新 API |
196
+ |---|---|
197
+ | `mcp_call({ server, tool, args_json: '{}' })` | `ext_call({ plugin: "mcp:<server>", tool, args: {} })` |
198
+ | `mcp_tool_schema({ server, tool })` | `ext_skill({ plugin: "mcp:<server>" })` |
199
+ | `skill_get_commands`(返回带 `:` 的命令名) | `framework.extensions.getExtensionNames()` + `getExtensionTools("skill:<name>")` |
package/docs/migration.md CHANGED
@@ -55,3 +55,103 @@
55
55
  |------|------|
56
56
  | `_setReady()` | 标记框架就绪并触发 `framework:ready` 事件 |
57
57
  | `isEnabled(name)` | 代理到 `pluginManager.isEnabled()` |
58
+
59
+ ---
60
+
61
+ ## 扩展调用统一重构(v2.x → v3.x)
62
+
63
+ ### 背景
64
+
65
+ 之前 MCP 工具调用有自己的 `mcp_call` / `mcp_tool_schema`,Skill 命令使用 `args.command: "<string>"` 字符串模式,与其他扩展的 Zod 结构化参数风格不一致。本次重构统一了所有"非 AI SDK 直调"的工具调用方式。
66
+
67
+ ### 旧 → 新对照
68
+
69
+ #### 1. MCP 工具调用
70
+
71
+ | 旧方式 | 新方式 |
72
+ |---|---|
73
+ | `mcp_call({ server, tool, args_json: '{"x":"y"}' })` | `ext_call({ plugin: "mcp:<server>", tool, args: { x: "y" } })` |
74
+ | `mcp_tool_schema({ server, tool })` | `ext_skill({ plugin: "mcp:<server>" })` |
75
+ | 工具名带前缀:`designmd_search_design_kits` | 原始 MCP 名:`search_design_kits` |
76
+
77
+ **移除的工具**:`mcp_call`、`mcp_tool_schema`(不再注册)
78
+
79
+ #### 2. Skill 命令调用
80
+
81
+ Skill 命令通过 `skill:<name>` 命名空间调用:
82
+
83
+ ```js
84
+ ext_call({
85
+ plugin: "skill:my-skill", // skill:<name>
86
+ tool: "cmd", // 命令名(不是 <skill>:<cmd>)
87
+ args: { command: "-n x -v" }
88
+ })
89
+ ```
90
+
91
+ **要点**:
92
+ - 每个 skill 是独立扩展 `skill:<name>`
93
+ - 命令是该扩展下的 tool
94
+ - `args: { command: "..." }` 传命令行字符串
95
+ - Commander.js 解析后传给 handler
96
+
97
+ #### 3. ext_skill 返回内容
98
+
99
+ `ext_skill({ plugin })` 通用返回(普通扩展):
100
+
101
+ ```
102
+ #### `<tool_name>`
103
+
104
+ <description>
105
+
106
+ **参数:**
107
+ - field
108
+ - Type
109
+ - ...
110
+ ```
111
+
112
+ `ext_skill({ plugin: "skill:<name>" })` 增强返回:
113
+
114
+ ```
115
+ # Skill: <name>
116
+
117
+ **<description>**
118
+
119
+ ## 技能说明
120
+
121
+ <SKILL.md 内容(剥掉 frontmatter)>
122
+
123
+ ---
124
+
125
+ ## 调用规则
126
+
127
+ > 通过 `ext_call({ plugin: "skill:<name>", tool: "<command>", args: {...} })` 调用
128
+
129
+ ---
130
+
131
+ ## 可用命令
132
+
133
+ ### `<command>`
134
+
135
+ <description>
136
+
137
+ **参数:**
138
+ - ...
139
+ ```
140
+
141
+ ### 内部变更
142
+
143
+ - `plugins/executors/extension/prompt-builder.js`:MCP 特殊处理移除,所有扩展统一通过 `zodSchemaToMarkdown` 渲染
144
+ - `plugins/executors/extension/skill-helper.js`:按 `skill:<name>` 命名空间迭代
145
+ - `src/plugin/base.js`:`Plugin` 基类新增 `skill` accessor(`register`/`get`/`has`/`remove`/`list`/`details`/`listOwned`/`execute`)
146
+ - `src/tool/schema.js`:`jsonSchemaToZod` 重构,避免嵌套 `Optional` 包装
147
+
148
+ ### Plugin 基类新增 accessor
149
+
150
+ | Accessor | 用途 |
151
+ |---|---|
152
+ | `this.skill.register(name, content, metadata, options)` | 程序化注册技能 |
153
+ | `this.skill.get(name)` / `this.skill.has(name)` | 查询 |
154
+ | `this.skill.details(name)` | 结构化详情 |
155
+ | `this.skill.list()` / `this.skill.listOwned()` | 列表 |
156
+ | `this.skill.remove(name)` | 删除 |
157
+ | `this.skill.execute('<skill>:<cmd>', args)` | 直接执行 |