foliko 1.0.80 → 1.0.81

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 (235) hide show
  1. package/.agent/agents/code-assistant.json +14 -0
  2. package/.agent/agents/email-assistant.json +14 -0
  3. package/.agent/agents/file-assistant.json +15 -0
  4. package/.agent/agents/system-assistant.json +15 -0
  5. package/.agent/agents/web-assistant.json +12 -0
  6. package/.agent/data/ambient/goals.json +50 -0
  7. package/.agent/data/ambient/memories.json +7 -0
  8. package/.agent/data/default.json +15 -31894
  9. package/.agent/data/plugins-state.json +146 -181
  10. package/.agent/data/scheduler/tasks.json +1 -0
  11. package/.agent/mcp_config.json +1 -0
  12. package/.agent/package.json +8 -0
  13. package/.agent/plugins/__pycache__/test_plugin.cpython-312.pyc +0 -0
  14. package/.agent/plugins/system-info/index.js +387 -0
  15. package/.agent/plugins/system-info/package.json +4 -0
  16. package/.agent/plugins/system-info/test.js +40 -0
  17. package/.agent/plugins/test_plugin.py +304 -0
  18. package/.agent/plugins.json +14 -5
  19. package/.agent/python-scripts/test_sample.py +24 -0
  20. package/.agent/skills/sysinfo/SKILL.md +38 -0
  21. package/.agent/skills/sysinfo/system-info.sh +130 -0
  22. package/.agent/skills/workflow/SKILL.md +324 -0
  23. package/.agent/workflows/email-digest.json +50 -0
  24. package/.agent/workflows/file-backup.json +21 -0
  25. package/.agent/workflows/get-ip-notify.json +32 -0
  26. package/.agent/workflows/news-aggregator.json +93 -0
  27. package/.agent/workflows/news-dashboard-v2.json +94 -0
  28. package/.agent/workflows/notification-batch.json +32 -0
  29. package/.claude/settings.local.json +171 -171
  30. package/.env.example +56 -56
  31. package/cli/bin/foliko.js +12 -12
  32. package/cli/src/commands/chat.js +143 -143
  33. package/cli/src/commands/list.js +93 -93
  34. package/cli/src/index.js +75 -75
  35. package/cli/src/ui/chat-ui.js +201 -201
  36. package/cli/src/utils/ansi.js +40 -40
  37. package/cli/src/utils/markdown.js +292 -292
  38. package/examples/ambient-example.js +194 -194
  39. package/examples/basic.js +115 -115
  40. package/examples/bootstrap.js +121 -121
  41. package/examples/mcp-example.js +56 -56
  42. package/examples/skill-example.js +49 -49
  43. package/examples/test-chat.js +137 -137
  44. package/examples/test-mcp.js +85 -85
  45. package/examples/test-reload.js +59 -59
  46. package/examples/test-telegram.js +50 -50
  47. package/examples/test-tg-bot.js +45 -45
  48. package/examples/test-tg-simple.js +47 -47
  49. package/examples/test-tg.js +62 -62
  50. package/examples/test-think.js +43 -43
  51. package/examples/test-web-plugin.js +103 -103
  52. package/examples/test-weixin-feishu.js +103 -103
  53. package/examples/workflow.js +158 -158
  54. package/package.json +83 -83
  55. package/plugins/ai-plugin.js +102 -102
  56. package/plugins/ambient-agent/EventWatcher.js +113 -113
  57. package/plugins/ambient-agent/ExplorerLoop.js +640 -640
  58. package/plugins/ambient-agent/GoalManager.js +197 -197
  59. package/plugins/ambient-agent/Reflector.js +95 -95
  60. package/plugins/ambient-agent/StateStore.js +90 -90
  61. package/plugins/ambient-agent/constants.js +101 -101
  62. package/plugins/ambient-agent/index.js +579 -579
  63. package/plugins/audit-plugin.js +187 -187
  64. package/plugins/default-plugins.js +548 -548
  65. package/plugins/email/constants.js +64 -64
  66. package/plugins/email/handlers.js +461 -461
  67. package/plugins/email/index.js +278 -278
  68. package/plugins/email/monitor.js +269 -269
  69. package/plugins/email/parser.js +138 -138
  70. package/plugins/email/reply.js +151 -151
  71. package/plugins/email/utils.js +124 -124
  72. package/plugins/extension-executor-plugin.js +326 -326
  73. package/plugins/feishu-plugin.js +481 -481
  74. package/plugins/file-system-plugin.js +920 -877
  75. package/plugins/gate-trading.js +747 -747
  76. package/plugins/install-plugin.js +199 -199
  77. package/plugins/python-executor-plugin.js +367 -367
  78. package/plugins/python-plugin-loader.js +651 -651
  79. package/plugins/rules-plugin.js +294 -294
  80. package/plugins/scheduler-plugin.js +691 -691
  81. package/plugins/session-plugin.js +494 -494
  82. package/plugins/shell-executor-plugin.js +197 -197
  83. package/plugins/storage-plugin.js +263 -263
  84. package/plugins/subagent-plugin.js +845 -845
  85. package/plugins/telegram-plugin.js +482 -482
  86. package/plugins/think-plugin.js +345 -345
  87. package/plugins/tools-plugin.js +196 -196
  88. package/plugins/web-plugin.js +637 -637
  89. package/plugins/weixin-plugin.js +545 -545
  90. package/skills/find-skills/AGENTS.md +162 -162
  91. package/skills/find-skills/SKILL.md +133 -133
  92. package/skills/foliko-dev/SKILL.md +563 -583
  93. package/skills/python-plugin-dev/SKILL.md +238 -238
  94. package/src/capabilities/index.js +11 -11
  95. package/src/capabilities/skill-manager.js +609 -609
  96. package/src/capabilities/workflow-engine.js +1109 -1109
  97. package/src/core/agent-chat.js +141 -134
  98. package/src/core/agent.js +958 -958
  99. package/src/core/framework.js +465 -465
  100. package/src/core/index.js +19 -19
  101. package/src/core/plugin-base.js +262 -262
  102. package/src/core/plugin-manager.js +863 -863
  103. package/src/core/provider.js +114 -114
  104. package/src/core/sub-agent-config.js +264 -264
  105. package/src/core/system-prompt-builder.js +120 -120
  106. package/src/core/tool-registry.js +517 -517
  107. package/src/core/tool-router.js +297 -297
  108. package/src/executors/executor-base.js +58 -58
  109. package/src/executors/mcp-executor.js +845 -845
  110. package/src/index.js +25 -25
  111. package/src/utils/circuit-breaker.js +301 -301
  112. package/src/utils/error-boundary.js +363 -363
  113. package/src/utils/error.js +374 -374
  114. package/src/utils/event-emitter.js +97 -97
  115. package/src/utils/id.js +133 -133
  116. package/src/utils/index.js +217 -217
  117. package/src/utils/logger.js +181 -181
  118. package/src/utils/plugin-helpers.js +90 -90
  119. package/src/utils/retry.js +122 -122
  120. package/src/utils/sandbox.js +292 -292
  121. package/test/tool-registry-validation.test.js +218 -218
  122. package/website/script.js +136 -136
  123. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +0 -26
  124. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +0 -97
  125. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +0 -101
  126. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +0 -31
  127. package/.agent/.shared/ui-ux-pro-max/data/products.csv +0 -97
  128. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +0 -24
  129. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +0 -45
  130. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  131. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  132. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  133. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  134. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -51
  135. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  136. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  137. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -54
  138. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  139. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  140. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  141. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  142. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +0 -59
  143. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +0 -58
  144. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  145. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  146. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +0 -31
  147. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  148. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  149. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +0 -258
  150. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +0 -1067
  151. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +0 -106
  152. package/.agent/ARCHITECTURE.md +0 -288
  153. package/.agent/agents/ambient-agent.md +0 -57
  154. package/.agent/agents/debugger.md +0 -55
  155. package/.agent/agents/email-assistant.md +0 -49
  156. package/.agent/agents/file-manager.md +0 -42
  157. package/.agent/agents/python-developer.md +0 -60
  158. package/.agent/agents/scheduler.md +0 -59
  159. package/.agent/agents/web-developer.md +0 -45
  160. package/.agent/mcp_config_updated.json +0 -12
  161. package/.agent/rules/GEMINI.md +0 -273
  162. package/.agent/rules/allow-rule.md +0 -77
  163. package/.agent/rules/log-rule.md +0 -83
  164. package/.agent/rules/security-rule.md +0 -93
  165. package/.agent/scripts/auto_preview.py +0 -148
  166. package/.agent/scripts/checklist.py +0 -217
  167. package/.agent/scripts/session_manager.py +0 -120
  168. package/.agent/scripts/verify_all.py +0 -327
  169. package/.agent/skills/api-patterns/SKILL.md +0 -81
  170. package/.agent/skills/api-patterns/api-style.md +0 -42
  171. package/.agent/skills/api-patterns/auth.md +0 -24
  172. package/.agent/skills/api-patterns/documentation.md +0 -26
  173. package/.agent/skills/api-patterns/graphql.md +0 -41
  174. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  175. package/.agent/skills/api-patterns/response.md +0 -37
  176. package/.agent/skills/api-patterns/rest.md +0 -40
  177. package/.agent/skills/api-patterns/scripts/api_validator.py +0 -211
  178. package/.agent/skills/api-patterns/security-testing.md +0 -122
  179. package/.agent/skills/api-patterns/trpc.md +0 -41
  180. package/.agent/skills/api-patterns/versioning.md +0 -22
  181. package/.agent/skills/app-builder/SKILL.md +0 -75
  182. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  183. package/.agent/skills/app-builder/feature-building.md +0 -53
  184. package/.agent/skills/app-builder/project-detection.md +0 -34
  185. package/.agent/skills/app-builder/scaffolding.md +0 -118
  186. package/.agent/skills/app-builder/tech-stack.md +0 -40
  187. package/.agent/skills/app-builder/templates/SKILL.md +0 -39
  188. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
  189. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
  190. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
  191. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
  192. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
  193. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
  194. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
  195. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
  196. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
  197. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
  198. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
  199. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
  200. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
  201. package/.agent/skills/architecture/SKILL.md +0 -55
  202. package/.agent/skills/architecture/context-discovery.md +0 -43
  203. package/.agent/skills/architecture/examples.md +0 -94
  204. package/.agent/skills/architecture/pattern-selection.md +0 -68
  205. package/.agent/skills/architecture/patterns-reference.md +0 -50
  206. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  207. package/.agent/skills/clean-code/SKILL.md +0 -201
  208. package/.agent/skills/doc.md +0 -177
  209. package/.agent/skills/frontend-design/SKILL.md +0 -418
  210. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  211. package/.agent/skills/frontend-design/color-system.md +0 -311
  212. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  213. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  214. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +0 -183
  215. package/.agent/skills/frontend-design/scripts/ux_audit.py +0 -722
  216. package/.agent/skills/frontend-design/typography-system.md +0 -345
  217. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  218. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  219. package/.agent/skills/i18n-localization/SKILL.md +0 -154
  220. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +0 -241
  221. package/.agent/skills/mcp-builder/SKILL.md +0 -176
  222. package/.agent/skills/web-design-guidelines/SKILL.md +0 -57
  223. package/.agent/workflows/brainstorm.md +0 -113
  224. package/.agent/workflows/create.md +0 -59
  225. package/.agent/workflows/debug.md +0 -103
  226. package/.agent/workflows/deploy.md +0 -176
  227. package/.agent/workflows/enhance.md +0 -63
  228. package/.agent/workflows/orchestrate.md +0 -237
  229. package/.agent/workflows/plan.md +0 -89
  230. package/.agent/workflows/preview.md +0 -81
  231. package/.agent/workflows/simple-test.md +0 -42
  232. package/.agent/workflows/status.md +0 -86
  233. package/.agent/workflows/structured-orchestrate.md +0 -180
  234. package/.agent/workflows/test.md +0 -144
  235. package/.agent/workflows/ui-ux-pro-max.md +0 -296
@@ -1,583 +1,563 @@
1
- ---
2
- name: foliko-dev
3
- description: Foliko Framework 插件开发指南。当用户说"创建插件"、"开发插件"时立即调用此 skill。
4
- allowed-tools: Read, Write, Edit, Glob, Grep, Bash
5
- ---
6
-
7
- # Foliko Plugin Development Guide
8
-
9
- ## 概述
10
-
11
- Foliko 是一个基于插件的 Agent 框架,核心简单,通过插件扩展功能。
12
-
13
- ---
14
-
15
- ## 插件存放位置
16
-
17
- ### `.agent/plugins/` 目录(用户插件,自动加载)
18
-
19
- 用户自定义插件放在项目根目录的 `.agent/plugins/` 下,**自动加载**,无需手动注册。
20
-
21
- **推荐使用文件夹结构**(适合复杂插件):
22
-
23
- ```
24
- 项目目录/
25
- └── .agent/
26
- └── plugins/
27
- ├── my-plugin/ ✅ 文件夹结构(推荐)
28
- │ ├── package.json # 可选,main 字段指定入口
29
- │ ├── index.js # 默认入口
30
- │ └── node_modules/ # 可选,插件私有依赖
31
- ├── another-plugin/ ✅ 另一个文件夹插件
32
- │ └── index.js
33
- └── legacy.js ✅ 单文件仍支持
34
- ```
35
-
36
- **文件夹结构的优势:**
37
-
38
- - 支持 `package.json` 的 `main` 字段自定义入口
39
- - 支持 `node_modules` 存放插件私有依赖
40
- - 更适合复杂插件的代码组织
41
-
42
- ### `plugins/` 目录(内置插件)
43
-
44
- 框架内置插件位于 `plugins/` 目录。
45
-
46
- ---
47
-
48
- ## 用户插件写法(`.agent/plugins/`)
49
-
50
- **必须使用免引入写法**:
51
-
52
- ### 文件夹结构(推荐)
53
-
54
- ```
55
- .agent/plugins/my-plugin/
56
- ├── package.json # 可选
57
- └── index.js # 入口
58
- ```
59
-
60
- ```json
61
- // package.json 示例
62
- {
63
- "name": "my-plugin",
64
- "main": "index.js"
65
- }
66
- ```
67
-
68
- ```javascript
69
- // .agent/plugins/my-plugin/index.js
70
- const { z } = require('zod');
71
-
72
- module.exports = function (Plugin) {
73
- return class MyPlugin extends Plugin {
74
- constructor(config = {}) {
75
- super();
76
- this.name = 'my-plugin';
77
- this.version = '1.0.0';
78
- this.description = '我的工具插件';
79
- this.priority = 10;
80
- }
81
-
82
- // 工具定义在 this.tools 中
83
- tools = {
84
- my_tool: {
85
- description: '我的工具',
86
- inputSchema: z.object({
87
- param: z.string().describe('参数描述'),
88
- }),
89
- execute: async (args) => {
90
- return { success: true, result: args.param };
91
- },
92
- },
93
- };
94
-
95
- install(framework) {
96
- // 也可以用 this.registerTool() 注册额外工具
97
- this.registerTool('another_tool', {
98
- description: '另一个工具',
99
- inputSchema: z.object({}),
100
- execute: async (args) => ({ success: true }),
101
- });
102
- return this;
103
- }
104
-
105
- uninstall(framework) {
106
- // 清理资源
107
- }
108
- };
109
- };
110
- ```
111
-
112
- ### 单文件结构(仍支持)
113
-
114
- ```javascript
115
- // .agent/plugins/my-plugin.js
116
- const { z } = require('zod');
117
-
118
- module.exports = function (Plugin) {
119
- return class MyPlugin extends Plugin {
120
- constructor(config = {}) {
121
- super();
122
- this.name = 'my-plugin';
123
- this.version = '1.0.0';
124
- this.description = '我的工具插件';
125
- this.priority = 10;
126
- }
127
-
128
- // 工具定义在 this.tools 中
129
- tools = {
130
- my_tool: {
131
- description: '我的工具',
132
- inputSchema: z.object({
133
- param: z.string().describe('参数描述'),
134
- }),
135
- execute: async (args) => {
136
- return { success: true, result: args.param };
137
- },
138
- },
139
- };
140
-
141
- install(framework) {
142
- return this;
143
- }
144
-
145
- uninstall(framework) {
146
- // 清理资源
147
- }
148
- };
149
- };
150
- ```
151
-
152
- **注意**:如果文件夹和同名 `.js` 文件同时存在,**文件夹优先**。
153
-
154
- **插件开发流程:**
155
-
156
- 1. **创建插件**(优先使用文件夹结构)
157
- 2. **安装依赖**:
158
- - 文件夹插件:`install { package: "包名", path: ".agent/plugins/插件名" }`
159
- - 单文件插件:`install { package: "包名" }`
160
- 3. **热重载**:`reload_plugins`
161
- 4. **检查加载状态**
162
-
163
- **关键点:**
164
-
165
- - `Plugin` 基类由系统自动传入(无需 require)
166
- - 函数直接返回插件类
167
- - 在 `install(framework)` 中通过 `framework` 注册工具
168
-
169
- ---
170
-
171
- ## 依赖管理
172
-
173
- 当插件需要使用第三方 npm 包(如 `zod`、`axios` 等)时,根据插件类型选择安装位置:
174
-
175
- | 插件类型 | 安装位置 | 说明 |
176
- | -------------- | ------------------------------------- | ---------------------- |
177
- | **文件夹插件** | `.agent/plugins/插件名/node_modules/` | 插件自包含,可独立迁移 |
178
- | **单文件插件** | `.agent/node_modules/` | 共享依赖 |
179
-
180
- ### 自动安装工具
181
-
182
- 框架提供了 `install` 工具,支持以下用法:
183
-
184
- ```javascript
185
- // 安装到默认位置 .agent/node_modules
186
- install({ package: 'zod' });
187
-
188
- // 安装到指定目录(用于文件夹插件)
189
- install({ package: 'axios', path: '.agent/plugins/my-plugin' });
190
-
191
- // 从 package.json 安装所有依赖到默认位置
192
- install({ file: './package.json' });
193
-
194
- // 从 package.json 安装所有依赖到指定目录
195
- install({ file: './my-plugin/package.json', path: '.agent/plugins/my-plugin' });
196
-
197
- // 仅指定路径,安装该目录下的 package.json 依赖
198
- install({ path: '.agent/plugins/my-plugin' });
199
- ```
200
-
201
- ### 文件夹插件的依赖安装示例
202
-
203
- ```javascript
204
- // .agent/plugins/my-plugin/index.js
205
- const { z } = require('zod');
206
-
207
- module.exports = function (Plugin) {
208
- return class MyPlugin extends Plugin {
209
- constructor(config = {}) {
210
- super();
211
- this.name = 'my-plugin';
212
- }
213
-
214
- tools = {
215
- fetch_data: {
216
- description: '获取远程数据',
217
- inputSchema: z.object({
218
- url: z.string().describe('API URL'),
219
- }),
220
- execute: async (args) => {
221
- // 安装到插件自己的目录
222
- const pluginDir = '.agent/plugins/my-plugin';
223
- await framework.callTool('install', {
224
- package: 'axios',
225
- path: pluginDir,
226
- });
227
-
228
- // 引入插件目录下的 node_modules
229
- const axios = require(`${pluginDir}/node_modules/axios`);
230
- const response = await axios.get(args.url);
231
- return { success: true, data: response.data };
232
- },
233
- },
234
- };
235
-
236
- install(framework) {
237
- return this;
238
- }
239
- };
240
- };
241
- ```
242
-
243
- ### 安装步骤
244
-
245
- 当 LLM 检测到 `Cannot find module 'xxx'` 错误时,必须:
246
-
247
- 1. **确定插件目录**:如果插件是文件夹结构,安装到插件目录
248
- 2. **调用 `install` 工具** 安装缺失的包
249
- 3. **安装完成后** 重新加载插件
250
- 4. **返回状态** 给用户
251
-
252
- 示例流程(文件夹插件):
253
-
254
- ```
255
- 错误: Cannot find module 'axios'
256
-
257
- 确定插件目录: .agent/plugins/my-plugin
258
-
259
- 自动安装: install { package: "axios", path: ".agent/plugins/my-plugin" }
260
-
261
- 重新加载插件
262
-
263
- 成功
264
- ```
265
-
266
- ### 重要提醒
267
-
268
- - **文件夹插件优先安装到插件目录** - 使用 `path` 参数指定插件目录
269
- - **不要尝试手动 require 全局安装的包** - 必须在指定目录中安装
270
- - **使用 `install` 工具自动处理** - 让 LLM 知道如何处理缺失依赖
271
- - **插件加载失败时检查依赖** - 优先安装缺失的包再重试
272
-
273
- ---
274
-
275
- ## 内置插件写法(`plugins/` 目录)
276
-
277
- 内置插件需要 `require` Plugin 基类:
278
-
279
- ```javascript
280
- // plugins/my-plugin.js
281
- const { Plugin } = require('../src/core/plugin-base');
282
- const { z } = require('zod');
283
-
284
- class MyPlugin extends Plugin {
285
- constructor(config = {}) {
286
- super();
287
- this.name = 'my-plugin';
288
- this.version = '1.0.0';
289
- this.description = '我的工具插件';
290
- this.priority = 10;
291
- }
292
-
293
- // 工具定义在 this.tools 中,ExtensionExecutor 自动扫描注册
294
- tools = {
295
- my_tool: {
296
- description: '我的工具',
297
- inputSchema: z.object({
298
- param: z.string().describe('参数描述'),
299
- }),
300
- execute: async (args) => {
301
- return { success: true, result: args.param };
302
- },
303
- },
304
- };
305
-
306
- install(framework) {
307
- // 可以用 this.registerTool() 注册额外工具
308
- this.registerTool('another_tool', {
309
- description: '另一个工具',
310
- inputSchema: z.object({}),
311
- execute: async (args) => ({ success: true }),
312
- });
313
- return this;
314
- }
315
-
316
- uninstall(framework) {}
317
- }
318
-
319
- module.exports = MyPlugin;
320
- ```
321
-
322
- ---
323
-
324
- ## 插件属性
325
-
326
- | 属性 | 类型 | 必须 | 说明 |
327
- | ------------- | ------ | ---- | ------------------------------------------------------------ |
328
- | `name` | string | ✅ | 唯一名称 |
329
- | `version` | string | ❌ | 版本号,默认 '1.0.0' |
330
- | `description` | string | ❌ | 插件描述 |
331
- | `priority` | number | ❌ | 加载优先级,默认 10 |
332
- | `tools` | object | ❌ | 工具定义 `{ name: toolDef }`,ExtensionExecutor 自动扫描注册 |
333
-
334
- ---
335
-
336
- ## 生命周期
337
-
338
- | 方法 | 调用时机 | 必须实现 |
339
- | ---------------------- | ---------- | -------- |
340
- | `install(framework)` | 插件安装时 | ✅ |
341
- | `start(framework)` | 插件启动时 | 推荐 |
342
- | `reload(framework)` | 热重载时 | 可选 |
343
- | `uninstall(framework)` | 卸载时 | 推荐 |
344
-
345
- ---
346
-
347
- ## 注册工具
348
-
349
- ### 最新方式:定义在 `this.tools = {}`
350
-
351
- 插件将工具定义在 `this.tools = {}` 中,ExtensionExecutor 会自动扫描并注册到系统提示词:
352
-
353
- ```javascript
354
- class MyPlugin extends Plugin {
355
- constructor(config = {}) {
356
- super();
357
- this.name = 'my-plugin';
358
- this.description = '我的工具插件';
359
- }
360
-
361
- tools = {
362
- my_tool: {
363
- description: '我的工具',
364
- inputSchema: z.object({
365
- param: z.string().describe('参数描述'),
366
- }),
367
- execute: async (args) => {
368
- return { success: true, result: args.param };
369
- },
370
- },
371
- };
372
- }
373
- ```
374
-
375
- ### 方式2:使用 `this.registerTool()`
376
-
377
- 支持两种调用格式:
378
-
379
- ```javascript
380
- install(framework) {
381
- const { z } = require('zod');
382
-
383
- // 方式1:分开传 name 和 def
384
- this.registerTool('my_tool', {
385
- description: '我的工具',
386
- inputSchema: z.object({
387
- param: z.string().describe('参数描述')
388
- }),
389
- execute: async (args) => {
390
- return { success: true, result: args.param };
391
- }
392
- });
393
-
394
- // 方式2:直接传对象(name 在对象中)
395
- this.registerTool({
396
- name: 'another_tool',
397
- description: '另一个工具',
398
- inputSchema: z.object({}),
399
- execute: async (args) => ({ success: true })
400
- });
401
-
402
- return this;
403
- }
404
- ```
405
-
406
- ### 旧方式(仍兼容,但不推荐)
407
-
408
- ```javascript
409
- install(framework) {
410
- framework.registerTool({
411
- name: 'my_tool',
412
- description: '工具描述',
413
- inputSchema: z.object({
414
- param: z.string().describe('参数描述')
415
- }),
416
- execute: async (args, framework) => {
417
- return { success: true, result: args.param }
418
- }
419
- })
420
- return this
421
- }
422
- ```
423
-
424
- ```
425
-
426
- ---
427
-
428
- ## 核心规则
429
-
430
- | 规则 | 说明 |
431
- | ----------------------------- | ------------------------------------------------- |
432
- | **优先使用 this.tools = {}** | ExtensionExecutor 自动扫描并注册到系统提示词 |
433
- | **优先使用文件夹结构** | 复杂插件推荐用文件夹,便于管理依赖和代码 |
434
- | **必须用 inputSchema** | `inputSchema: z.object({})`(不是 parameters!) |
435
- | **必须用 zod 定义参数** | `param: z.string().describe('描述')` |
436
- | **install 必须返回 this** | 确保链式调用 |
437
- | **文件夹与文件重名时** | 文件夹优先,同名 `.js` 文件会被忽略 |
438
- | **工具自动出现在系统提示词** | 定义在 `this.tools` 中会自动注册 |
439
-
440
- ## 开发完成后注意事项
441
-
442
- ### 引入第三方库时
443
-
444
- **必须先安装依赖,再热重载!**
445
-
446
- 如果插件需要使用第三方 npm 包(如 `zod`、`axios`),按以下顺序操作:
447
-
448
- 1. **创建插件文件**(暂不加载)
449
- 2. **安装依赖**:`install { package: "包名" }`
450
- 3. **热重载**:`reload_plugins`
451
- 4. **检查加载状态**
452
-
453
- 示例:
454
-
455
- ```
456
-
457
- 创建插件 my-plugin.js(需要 zod)
458
-
459
- install { package: "zod" }
460
-
461
- reload_plugins
462
-
463
- 成功加载
464
-
465
- ````
466
-
467
- ### 其他注意事项
468
-
469
- --**开发完成重载成功后检测有没有加载新的插件,不需要进行过多测试步骤,直接告知用户状态即可**
470
-
471
- ---
472
-
473
- ## 内置占位符
474
-
475
- Agent 支持 `sharedPrompt` 中的占位符替换:
476
-
477
- | 占位符 | 说明 |
478
- | --------------- | -------- |
479
- | `{{WORK_DIR}}` | 工作目录 |
480
- | `{{HOME_DIR}}` | 主目录 |
481
- | `{{HOST_NAME}}` | 主机名 |
482
- | `{{PLATFORM}}` | 平台 |
483
- | `{{TIME}}` | 当前时间 |
484
- | `{{DATE}}` | 当前日期 |
485
-
486
- ---
487
-
488
- ## 创建 Agent
489
-
490
- ```javascript
491
- const agent = framework.createAgent({
492
- name: 'MyAgent',
493
- systemPrompt: '你是一个助手',
494
- sharedPrompt: '工作目录: {{WORK_DIR}}\n项目: {{projectName}}',
495
- metadata: {
496
- projectName: 'MyProject',
497
- version: '1.0.0',
498
- },
499
- });
500
- ````
501
-
502
- ---
503
-
504
- ## 热重载
505
-
506
- ```javascript
507
- // 重载单个插件
508
- await framework.reloadPlugin('my-plugin');
509
-
510
- // 重载所有插件
511
- await framework.reloadAllPlugins();
512
- ```
513
-
514
- ---
515
-
516
- ## 子 Agent 注册
517
-
518
- 插件可以通过 `this.agents = []` 配置或 `this.registerSubAgent()` 方法注册子Agent。
519
-
520
- ### 方式1:配置 `agents` 数组
521
-
522
- ```javascript
523
- // plugins/my-plugin.js
524
- const { Plugin } = require('../src/core/plugin-base');
525
- const { tool } = require('ai');
526
- const { z } = require('zod');
527
-
528
- class MyPlugin extends Plugin {
529
- constructor(config = {}) {
530
- super();
531
- this.name = 'my-plugin';
532
- }
533
-
534
- // 配置式注册子Agent,插件启动时自动创建
535
- agents = [
536
- {
537
- name: 'code-agent',
538
- role: '代码专家',
539
- description: '处理代码开发任务',
540
- tools: {
541
- compile: tool({
542
- description: '编译代码',
543
- parameters: z.object({
544
- language: z.string(),
545
- code: z.string(),
546
- }),
547
- execute: async (args) => ({ success: true }),
548
- }),
549
- },
550
- parentTools: ['read_file', 'write_file'],
551
- },
552
- ];
553
- }
554
- ```
555
-
556
- ### 方式2:手动调用 `registerSubAgent()`
557
-
558
- ```javascript
559
- start(framework) {
560
- this.registerSubAgent({
561
- name: 'code-agent',
562
- role: '代码专家',
563
- tools: {
564
- compile: tool({
565
- description: '编译代码',
566
- parameters: z.object({ language: z.string(), code: z.string() }),
567
- execute: async (args) => ({ success: true })
568
- })
569
- },
570
- parentTools: ['read_file', 'write_file']
571
- })
572
- }
573
- ```
574
-
575
- ### 子Agent配置说明
576
-
577
- | 字段 | 类型 | 说明 |
578
- | ------------- | ------ | ----------------------------------------------- |
579
- | `name` | string | 子Agent名称(唯一标识) |
580
- | `role` | string | 角色描述 |
581
- | `description` | string | 详细描述 |
582
- | `tools` | object | 自定义工具 `{ name: toolDef }`,只属于此子Agent |
583
- | `parentTools` | array | 从父Agent继承的工具名称列表 |
1
+ ---
2
+ name: foliko-dev
3
+ description: Foliko Framework 插件开发指南。当用户说"创建插件"、"开发插件"时立即调用此 skill。
4
+ allowed-tools: Read, Write, Edit, Glob, Grep, Bash
5
+ ---
6
+
7
+ # Foliko Plugin Development Guide
8
+
9
+ ## 概述
10
+
11
+ Foliko 是一个基于插件的 Agent 框架,核心简单,通过插件扩展功能。
12
+
13
+ ---
14
+
15
+ ## 插件存放位置
16
+
17
+ ### `.agent/plugins/` 目录(用户插件,自动加载)
18
+
19
+ 用户自定义插件放在项目根目录的 `.agent/plugins/` 下,**自动加载**,无需手动注册。
20
+
21
+ **推荐使用文件夹结构**(适合复杂插件):
22
+
23
+ ```
24
+ 项目目录/
25
+ └── .agent/
26
+ └── plugins/
27
+ ├── my-plugin/ ✅ 文件夹结构(推荐)
28
+ │ ├── package.json # 可选,main 字段指定入口
29
+ │ ├── index.js # 默认入口
30
+ │ └── node_modules/ # 可选,插件私有依赖
31
+ ├── another-plugin/ ✅ 另一个文件夹插件
32
+ │ └── index.js
33
+ └── legacy.js ✅ 单文件仍支持
34
+ ```
35
+
36
+ **文件夹结构的优势:**
37
+
38
+ - 支持 `package.json` 的 `main` 字段自定义入口
39
+ - 支持 `node_modules` 存放插件私有依赖
40
+ - 更适合复杂插件的代码组织
41
+
42
+ ### `plugins/` 目录(内置插件)
43
+
44
+ 框架内置插件位于 `plugins/` 目录。
45
+
46
+ ---
47
+
48
+ ## 用户插件写法(`.agent/plugins/`)
49
+
50
+ **必须使用免引入写法**:
51
+
52
+ ### 文件夹结构(推荐)
53
+
54
+ ```
55
+ .agent/plugins/my-plugin/
56
+ ├── package.json # 可选
57
+ └── index.js # 入口
58
+ ```
59
+
60
+ ```json
61
+ // package.json 示例
62
+ {
63
+ "name": "my-plugin",
64
+ "main": "index.js"
65
+ }
66
+ ```
67
+
68
+ ```javascript
69
+ // .agent/plugins/my-plugin/index.js
70
+ const { z } = require('zod');
71
+
72
+ module.exports = function (Plugin) {
73
+ return class MyPlugin extends Plugin {
74
+ constructor(config = {}) {
75
+ super();
76
+ this.name = 'my-plugin';
77
+ this.version = '1.0.0';
78
+ this.description = '我的工具插件';
79
+ this.priority = 10;
80
+ }
81
+
82
+ // 工具定义在 this.tools 中
83
+ tools = {
84
+ my_tool: {
85
+ description: '我的工具',
86
+ inputSchema: z.object({
87
+ param: z.string().describe('参数描述'),
88
+ }),
89
+ execute: async (args) => {
90
+ return { success: true, result: args.param };
91
+ },
92
+ },
93
+ };
94
+
95
+ install(framework) {
96
+ // 也可以用 this.registerTool() 注册额外工具
97
+ this.registerTool('another_tool', {
98
+ description: '另一个工具',
99
+ inputSchema: z.object({}),
100
+ execute: async (args) => ({ success: true }),
101
+ });
102
+ return this;
103
+ }
104
+
105
+ uninstall(framework) {
106
+ // 清理资源
107
+ }
108
+ };
109
+ };
110
+ ```
111
+
112
+ ### 单文件结构(仍支持)
113
+
114
+ ```javascript
115
+ // .agent/plugins/my-plugin.js
116
+ const { z } = require('zod');
117
+
118
+ module.exports = function (Plugin) {
119
+ return class MyPlugin extends Plugin {
120
+ constructor(config = {}) {
121
+ super();
122
+ this.name = 'my-plugin';
123
+ this.version = '1.0.0';
124
+ this.description = '我的工具插件';
125
+ this.priority = 10;
126
+ }
127
+
128
+ // 工具定义在 this.tools 中
129
+ tools = {
130
+ my_tool: {
131
+ description: '我的工具',
132
+ inputSchema: z.object({
133
+ param: z.string().describe('参数描述'),
134
+ }),
135
+ execute: async (args) => {
136
+ return { success: true, result: args.param };
137
+ },
138
+ },
139
+ };
140
+
141
+ install(framework) {
142
+ return this;
143
+ }
144
+
145
+ uninstall(framework) {
146
+ // 清理资源
147
+ }
148
+ };
149
+ };
150
+ ```
151
+
152
+ **注意**:如果文件夹和同名 `.js` 文件同时存在,**文件夹优先**。
153
+
154
+ **插件开发流程:**
155
+
156
+ 1. **创建插件**(优先使用文件夹结构)
157
+ 2. **安装依赖**:
158
+ - 文件夹插件:`install { package: "包名", path: ".agent/plugins/插件名" }`
159
+ - 单文件插件:`install { package: "包名" }`
160
+ 3. **热重载**:`reload_plugins`
161
+ 4. **检查加载状态**
162
+
163
+ **关键点:**
164
+
165
+ - `Plugin` 基类由系统自动传入(无需 require)
166
+ - 函数直接返回插件类
167
+ - 在 `install(framework)` 中通过 `framework` 注册工具
168
+
169
+ ---
170
+
171
+ ## 依赖管理
172
+
173
+ 当插件需要使用第三方 npm 包(如 `zod`、`axios` 等)时,根据插件类型选择安装位置:
174
+
175
+ | 插件类型 | 安装位置 | 说明 |
176
+ | -------------- | ------------------------------------- | ---------------------- |
177
+ | **文件夹插件** | `.agent/plugins/插件名/node_modules/` | 插件自包含,可独立迁移 |
178
+ | **单文件插件** | `.agent/node_modules/` | 共享依赖 |
179
+
180
+ ### 自动安装工具
181
+
182
+ 框架提供了 `install` 工具,支持以下用法:
183
+
184
+ ```javascript
185
+ // 安装到默认位置 .agent/node_modules
186
+ install({ package: 'zod' });
187
+
188
+ // 安装到指定目录(用于文件夹插件)
189
+ install({ package: 'axios', path: '.agent/plugins/my-plugin' });
190
+
191
+ // 从 package.json 安装所有依赖到默认位置
192
+ install({ file: './package.json' });
193
+
194
+ // 从 package.json 安装所有依赖到指定目录
195
+ install({ file: './my-plugin/package.json', path: '.agent/plugins/my-plugin' });
196
+
197
+ // 仅指定路径,安装该目录下的 package.json 依赖
198
+ install({ path: '.agent/plugins/my-plugin' });
199
+ ```
200
+
201
+ ### 文件夹插件的依赖安装示例
202
+
203
+ ```javascript
204
+ // .agent/plugins/my-plugin/index.js
205
+ const { z } = require('zod');
206
+
207
+ module.exports = function (Plugin) {
208
+ return class MyPlugin extends Plugin {
209
+ constructor(config = {}) {
210
+ super();
211
+ this.name = 'my-plugin';
212
+ }
213
+
214
+ tools = {
215
+ fetch_data: {
216
+ description: '获取远程数据',
217
+ inputSchema: z.object({
218
+ url: z.string().describe('API URL'),
219
+ }),
220
+ execute: async (args) => {
221
+ // 安装到插件自己的目录
222
+ const pluginDir = '.agent/plugins/my-plugin';
223
+ await framework.callTool('install', {
224
+ package: 'axios',
225
+ path: pluginDir,
226
+ });
227
+
228
+ // 引入插件目录下的 node_modules
229
+ const axios = require(`${pluginDir}/node_modules/axios`);
230
+ const response = await axios.get(args.url);
231
+ return { success: true, data: response.data };
232
+ },
233
+ },
234
+ };
235
+
236
+ install(framework) {
237
+ return this;
238
+ }
239
+ };
240
+ };
241
+ ```
242
+
243
+ ### 安装步骤
244
+
245
+ 当 LLM 检测到 `Cannot find module 'xxx'` 错误时,必须:
246
+
247
+ 1. **确定插件目录**:如果插件是文件夹结构,安装到插件目录
248
+ 2. **调用 `install` 工具** 安装缺失的包
249
+ 3. **安装完成后** 重新加载插件
250
+ 4. **返回状态** 给用户
251
+
252
+ 示例流程(文件夹插件):
253
+
254
+ ```
255
+ 错误: Cannot find module 'axios'
256
+
257
+ 确定插件目录: .agent/plugins/my-plugin
258
+
259
+ 自动安装: install { package: "axios", path: ".agent/plugins/my-plugin" }
260
+
261
+ 重新加载插件
262
+
263
+ 成功
264
+ ```
265
+
266
+ ### 重要提醒
267
+
268
+ - **文件夹插件优先安装到插件目录** - 使用 `path` 参数指定插件目录
269
+ - **不要尝试手动 require 全局安装的包** - 必须在指定目录中安装
270
+ - **使用 `install` 工具自动处理** - 让 LLM 知道如何处理缺失依赖
271
+ - **插件加载失败时检查依赖** - 优先安装缺失的包再重试
272
+
273
+ ---
274
+
275
+ ## 内置插件写法(`plugins/` 目录)
276
+
277
+ 内置插件需要 `require` Plugin 基类:
278
+
279
+ ```javascript
280
+ // plugins/my-plugin.js
281
+ const { Plugin } = require('../src/core/plugin-base');
282
+ const { z } = require('zod');
283
+
284
+ class MyPlugin extends Plugin {
285
+ constructor(config = {}) {
286
+ super();
287
+ this.name = 'my-plugin';
288
+ this.version = '1.0.0';
289
+ this.description = '我的工具插件';
290
+ this.priority = 10;
291
+ }
292
+
293
+ // 工具定义在 this.tools 中,ExtensionExecutor 自动扫描注册
294
+ tools = {
295
+ my_tool: {
296
+ description: '我的工具',
297
+ inputSchema: z.object({
298
+ param: z.string().describe('参数描述'),
299
+ }),
300
+ execute: async (args) => {
301
+ return { success: true, result: args.param };
302
+ },
303
+ },
304
+ };
305
+
306
+ install(framework) {
307
+ // 可以用 this.registerTool() 注册额外工具
308
+ this.registerTool('another_tool', {
309
+ description: '另一个工具',
310
+ inputSchema: z.object({}),
311
+ execute: async (args) => ({ success: true }),
312
+ });
313
+ return this;
314
+ }
315
+
316
+ uninstall(framework) {}
317
+ }
318
+
319
+ module.exports = MyPlugin;
320
+ ```
321
+
322
+ ---
323
+
324
+ ## 插件属性
325
+
326
+ | 属性 | 类型 | 必须 | 说明 |
327
+ | ------------- | ------ | ---- | ------------------------------------------------------------ |
328
+ | `name` | string | ✅ | 唯一名称 |
329
+ | `version` | string | ❌ | 版本号,默认 '1.0.0' |
330
+ | `description` | string | ❌ | 插件描述 |
331
+ | `priority` | number | ❌ | 加载优先级,默认 10 |
332
+ | `tools` | object | ❌ | 工具定义 `{ name: toolDef }`,ExtensionExecutor 自动扫描注册 |
333
+
334
+ ---
335
+
336
+ ## 生命周期
337
+
338
+ | 方法 | 调用时机 | 必须实现 |
339
+ | ---------------------- | ---------- | -------- |
340
+ | `install(framework)` | 插件安装时 | ✅ |
341
+ | `start(framework)` | 插件启动时 | 推荐 |
342
+ | `reload(framework)` | 热重载时 | 可选 |
343
+ | `uninstall(framework)` | 卸载时 | 推荐 |
344
+
345
+ ---
346
+
347
+ ## 注册工具
348
+
349
+ ### 最新方式:定义在 `this.tools = {}`
350
+
351
+ 插件将工具定义在 `this.tools = {}` 中,ExtensionExecutor 会自动扫描并注册到系统提示词:
352
+
353
+ ```javascript
354
+ class MyPlugin extends Plugin {
355
+ constructor(config = {}) {
356
+ super();
357
+ this.name = 'my-plugin';
358
+ this.description = '我的工具插件';
359
+ }
360
+
361
+ tools = {
362
+ my_tool: {
363
+ description: '我的工具',
364
+ inputSchema: z.object({
365
+ param: z.string().describe('参数描述'),
366
+ }),
367
+ execute: async (args) => {
368
+ return { success: true, result: args.param };
369
+ },
370
+ },
371
+ };
372
+ }
373
+ ```
374
+
375
+ ### 方式2:使用 `this.registerTool()`
376
+
377
+ 支持两种调用格式:
378
+
379
+ ```javascript
380
+ install(framework) {
381
+ const { z } = require('zod');
382
+
383
+ // 方式1:分开传 name 和 def
384
+ this.registerTool('my_tool', {
385
+ description: '我的工具',
386
+ inputSchema: z.object({
387
+ param: z.string().describe('参数描述')
388
+ }),
389
+ execute: async (args) => {
390
+ return { success: true, result: args.param };
391
+ }
392
+ });
393
+
394
+ // 方式2:直接传对象(name 在对象中)
395
+ this.registerTool({
396
+ name: 'another_tool',
397
+ description: '另一个工具',
398
+ inputSchema: z.object({}),
399
+ execute: async (args) => ({ success: true })
400
+ });
401
+
402
+ return this;
403
+ }
404
+ ```
405
+
406
+ ---
407
+
408
+ ## 核心规则
409
+
410
+ | 规则 | 说明 |
411
+ | ---------------------------- | ----------------------------------------------- |
412
+ | **优先使用 this.tools = {}** | ExtensionExecutor 自动扫描并注册到系统提示词 |
413
+ | **优先使用文件夹结构** | 复杂插件推荐用文件夹,便于管理依赖和代码 |
414
+ | **必须用 inputSchema** | `inputSchema: z.object({})`(不是 parameters!) |
415
+ | **必须用 zod 定义参数** | `param: z.string().describe('描述')` |
416
+ | **install 必须返回 this** | 确保链式调用 |
417
+ | **文件夹与文件重名时** | 文件夹优先,同名 `.js` 文件会被忽略 |
418
+ | **工具自动出现在系统提示词** | 定义在 `this.tools` 中会自动注册 |
419
+
420
+ ## 开发完成后注意事项
421
+
422
+ ### 引入第三方库时
423
+
424
+ **必须先安装依赖,再热重载!**
425
+
426
+ 如果插件需要使用第三方 npm 包(如 `zod`、`axios`),按以下顺序操作:
427
+
428
+ 1. **创建插件文件**(暂不加载)
429
+ 2. **安装依赖**:`install { package: "包名" }`
430
+ 3. **热重载**:`reload_plugins`
431
+ 4. **检查加载状态**
432
+
433
+ 示例:
434
+
435
+ ```
436
+
437
+ 创建插件 my-plugin.js(需要 zod)
438
+
439
+ install { package: "zod" }
440
+
441
+ reload_plugins
442
+
443
+ 成功加载
444
+
445
+ ```
446
+
447
+ ### 其他注意事项
448
+
449
+ --**开发完成重载成功后检测有没有加载新的插件,不需要进行过多测试步骤,直接告知用户状态即可**
450
+
451
+ ---
452
+
453
+ ## 内置占位符
454
+
455
+ Agent 支持 `sharedPrompt` 中的占位符替换:
456
+
457
+ | 占位符 | 说明 |
458
+ | --------------- | -------- |
459
+ | `{{WORK_DIR}}` | 工作目录 |
460
+ | `{{HOME_DIR}}` | 主目录 |
461
+ | `{{HOST_NAME}}` | 主机名 |
462
+ | `{{PLATFORM}}` | 平台 |
463
+ | `{{TIME}}` | 当前时间 |
464
+ | `{{DATE}}` | 当前日期 |
465
+
466
+ ---
467
+
468
+ ## 创建 Agent
469
+
470
+ ```javascript
471
+ const agent = framework.createAgent({
472
+ name: 'MyAgent',
473
+ systemPrompt: '你是一个助手',
474
+ sharedPrompt: '工作目录: {{WORK_DIR}}\n项目: {{projectName}}',
475
+ metadata: {
476
+ projectName: 'MyProject',
477
+ version: '1.0.0',
478
+ },
479
+ });
480
+ ```
481
+
482
+ ---
483
+
484
+ ## 热重载
485
+
486
+ ```javascript
487
+ // 重载单个插件
488
+ await framework.reloadPlugin('my-plugin');
489
+
490
+ // 重载所有插件
491
+ await framework.reloadAllPlugins();
492
+ ```
493
+
494
+ ---
495
+
496
+ ## 子 Agent 注册
497
+
498
+ 插件可以通过 `this.agents = []` 配置或 `this.registerSubAgent()` 方法注册子Agent。
499
+
500
+ ### 方式1:配置 `agents` 数组
501
+
502
+ ```javascript
503
+ // plugins/my-plugin.js
504
+ const { Plugin } = require('../src/core/plugin-base');
505
+ const { tool } = require('ai');
506
+ const { z } = require('zod');
507
+
508
+ class MyPlugin extends Plugin {
509
+ constructor(config = {}) {
510
+ super();
511
+ this.name = 'my-plugin';
512
+ }
513
+
514
+ // 配置式注册子Agent,插件启动时自动创建
515
+ agents = [
516
+ {
517
+ name: 'code-agent',
518
+ role: '代码专家',
519
+ description: '处理代码开发任务',
520
+ tools: {
521
+ compile: tool({
522
+ description: '编译代码',
523
+ parameters: z.object({
524
+ language: z.string(),
525
+ code: z.string(),
526
+ }),
527
+ execute: async (args) => ({ success: true }),
528
+ }),
529
+ },
530
+ parentTools: ['read_file', 'write_file'],
531
+ },
532
+ ];
533
+ }
534
+ ```
535
+
536
+ ### 方式2:手动调用 `registerSubAgent()`
537
+
538
+ ```javascript
539
+ start(framework) {
540
+ this.registerSubAgent({
541
+ name: 'code-agent',
542
+ role: '代码专家',
543
+ tools: {
544
+ compile: tool({
545
+ description: '编译代码',
546
+ parameters: z.object({ language: z.string(), code: z.string() }),
547
+ execute: async (args) => ({ success: true })
548
+ })
549
+ },
550
+ parentTools: ['read_file', 'write_file']
551
+ })
552
+ }
553
+ ```
554
+
555
+ ### 子Agent配置说明
556
+
557
+ | 字段 | 类型 | 说明 |
558
+ | ------------- | ------ | ----------------------------------------------- |
559
+ | `name` | string | 子Agent名称(唯一标识) |
560
+ | `role` | string | 角色描述 |
561
+ | `description` | string | 详细描述 |
562
+ | `tools` | object | 自定义工具 `{ name: toolDef }`,只属于此子Agent |
563
+ | `parentTools` | array | 从父Agent继承的工具名称列表 |