foliko 1.0.84 → 1.0.86

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 (170) 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 +4156 -244
  9. package/.agent/data/plugins-state.json +162 -174
  10. package/.agent/data/scheduler/tasks.json +1 -0
  11. package/.agent/data/weixin.json +6 -0
  12. package/.agent/mcp_config.json +1 -0
  13. package/.agent/package.json +8 -0
  14. package/.agent/plugins/__pycache__/test_plugin.cpython-312.pyc +0 -0
  15. package/.agent/plugins/daytona/README.md +89 -0
  16. package/.agent/plugins/daytona/index.js +377 -0
  17. package/.agent/plugins/daytona/package.json +12 -0
  18. package/.agent/plugins/marknative/README.md +134 -0
  19. package/.agent/plugins/marknative/index.js +233 -0
  20. package/.agent/plugins/marknative/package.json +12 -0
  21. package/.agent/plugins/marknative/update-readme.js +134 -0
  22. package/.agent/plugins/system-info/index.js +387 -0
  23. package/.agent/plugins/system-info/package.json +4 -0
  24. package/.agent/plugins/system-info/test.js +40 -0
  25. package/.agent/plugins/temp-repo/LICENSE +201 -0
  26. package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/index.js +101 -3
  27. package/.agent/plugins/test_plugin.py +304 -0
  28. package/.agent/plugins.json +14 -5
  29. package/.agent/python-scripts/test_sample.py +24 -0
  30. package/.agent/skills/agent-browser/SKILL.md +311 -0
  31. package/.agent/skills/agent-browser/TEST_PLAN.md +200 -0
  32. package/.agent/skills/sysinfo/SKILL.md +38 -0
  33. package/.agent/skills/sysinfo/system-info.sh +130 -0
  34. package/.agent/skills/workflow/SKILL.md +324 -0
  35. package/.agent/workflows/email-digest.json +50 -0
  36. package/.agent/workflows/file-backup.json +21 -0
  37. package/.agent/workflows/get-ip-notify.json +32 -0
  38. package/.agent/workflows/news-aggregator.json +93 -0
  39. package/.agent/workflows/news-dashboard-v2.json +94 -0
  40. package/.agent/workflows/notification-batch.json +32 -0
  41. package/.claude/settings.local.json +171 -178
  42. package/.env.example +56 -56
  43. package/README.md +441 -441
  44. package/package.json +2 -2
  45. package/plugins/ambient-agent/EventWatcher.js +4 -4
  46. package/plugins/extension-executor-plugin.js +52 -1
  47. package/plugins/file-system-plugin.js +44 -5
  48. package/plugins/session-plugin.js +3 -3
  49. package/plugins/weixin-plugin.js +278 -29
  50. package/skills/find-skills/AGENTS.md +162 -162
  51. package/skills/find-skills/SKILL.md +133 -133
  52. package/skills/foliko-dev/SKILL.md +67 -0
  53. package/skills/python-plugin-dev/SKILL.md +238 -238
  54. package/src/core/agent-chat.js +11 -21
  55. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +0 -26
  56. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +0 -97
  57. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +0 -101
  58. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +0 -31
  59. package/.agent/.shared/ui-ux-pro-max/data/products.csv +0 -97
  60. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +0 -24
  61. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +0 -45
  62. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  63. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  64. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  65. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  66. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -51
  67. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  68. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  69. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -54
  70. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  71. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  72. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  73. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  74. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +0 -59
  75. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +0 -58
  76. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  77. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  78. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +0 -31
  79. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  80. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  81. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +0 -258
  82. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +0 -1067
  83. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +0 -106
  84. package/.agent/ARCHITECTURE.md +0 -288
  85. package/.agent/agents/ambient-agent.md +0 -57
  86. package/.agent/agents/debugger.md +0 -55
  87. package/.agent/agents/email-assistant.md +0 -49
  88. package/.agent/agents/file-manager.md +0 -42
  89. package/.agent/agents/python-developer.md +0 -60
  90. package/.agent/agents/scheduler.md +0 -59
  91. package/.agent/agents/web-developer.md +0 -45
  92. package/.agent/data/puppeteer-sessions/undefined.json +0 -6
  93. package/.agent/mcp_config_updated.json +0 -12
  94. package/.agent/rules/GEMINI.md +0 -273
  95. package/.agent/rules/allow-rule.md +0 -77
  96. package/.agent/rules/log-rule.md +0 -83
  97. package/.agent/rules/security-rule.md +0 -93
  98. package/.agent/scripts/auto_preview.py +0 -148
  99. package/.agent/scripts/checklist.py +0 -217
  100. package/.agent/scripts/session_manager.py +0 -120
  101. package/.agent/scripts/verify_all.py +0 -327
  102. package/.agent/skills/api-patterns/SKILL.md +0 -81
  103. package/.agent/skills/api-patterns/api-style.md +0 -42
  104. package/.agent/skills/api-patterns/auth.md +0 -24
  105. package/.agent/skills/api-patterns/documentation.md +0 -26
  106. package/.agent/skills/api-patterns/graphql.md +0 -41
  107. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  108. package/.agent/skills/api-patterns/response.md +0 -37
  109. package/.agent/skills/api-patterns/rest.md +0 -40
  110. package/.agent/skills/api-patterns/scripts/api_validator.py +0 -211
  111. package/.agent/skills/api-patterns/security-testing.md +0 -122
  112. package/.agent/skills/api-patterns/trpc.md +0 -41
  113. package/.agent/skills/api-patterns/versioning.md +0 -22
  114. package/.agent/skills/app-builder/SKILL.md +0 -75
  115. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  116. package/.agent/skills/app-builder/feature-building.md +0 -53
  117. package/.agent/skills/app-builder/project-detection.md +0 -34
  118. package/.agent/skills/app-builder/scaffolding.md +0 -118
  119. package/.agent/skills/app-builder/tech-stack.md +0 -40
  120. package/.agent/skills/app-builder/templates/SKILL.md +0 -39
  121. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
  122. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
  123. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
  124. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
  125. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
  126. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
  127. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
  128. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
  129. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
  130. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
  131. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
  132. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
  133. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
  134. package/.agent/skills/architecture/SKILL.md +0 -55
  135. package/.agent/skills/architecture/context-discovery.md +0 -43
  136. package/.agent/skills/architecture/examples.md +0 -94
  137. package/.agent/skills/architecture/pattern-selection.md +0 -68
  138. package/.agent/skills/architecture/patterns-reference.md +0 -50
  139. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  140. package/.agent/skills/clean-code/SKILL.md +0 -201
  141. package/.agent/skills/doc.md +0 -177
  142. package/.agent/skills/frontend-design/SKILL.md +0 -418
  143. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  144. package/.agent/skills/frontend-design/color-system.md +0 -311
  145. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  146. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  147. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +0 -183
  148. package/.agent/skills/frontend-design/scripts/ux_audit.py +0 -722
  149. package/.agent/skills/frontend-design/typography-system.md +0 -345
  150. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  151. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  152. package/.agent/skills/i18n-localization/SKILL.md +0 -154
  153. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +0 -241
  154. package/.agent/skills/mcp-builder/SKILL.md +0 -176
  155. package/.agent/skills/web-design-guidelines/SKILL.md +0 -57
  156. package/.agent/workflows/brainstorm.md +0 -113
  157. package/.agent/workflows/create.md +0 -59
  158. package/.agent/workflows/debug.md +0 -103
  159. package/.agent/workflows/deploy.md +0 -176
  160. package/.agent/workflows/enhance.md +0 -63
  161. package/.agent/workflows/orchestrate.md +0 -237
  162. package/.agent/workflows/plan.md +0 -89
  163. package/.agent/workflows/preview.md +0 -81
  164. package/.agent/workflows/simple-test.md +0 -42
  165. package/.agent/workflows/status.md +0 -86
  166. package/.agent/workflows/structured-orchestrate.md +0 -180
  167. package/.agent/workflows/test.md +0 -144
  168. package/.agent/workflows/ui-ux-pro-max.md +0 -296
  169. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/README.md +0 -0
  170. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/package.json +0 -0
@@ -0,0 +1,233 @@
1
+ const { z } = require('zod');
2
+ const path = require('path');
3
+ const fs = require('fs');
4
+
5
+ module.exports = function (Plugin) {
6
+ return class MarkNativePlugin extends Plugin {
7
+ constructor(config = {}) {
8
+ super();
9
+ this.name = 'marknative';
10
+ this.version = '1.0.0';
11
+ this.description = 'Markdown 转图片插件 - 将 Markdown 转换为 PNG/SVG';
12
+ this.priority = 10;
13
+ this.marknative = null;
14
+ this.checked = false;
15
+ }
16
+
17
+ async _ensureMarkNative() {
18
+ if (this.checked) return;
19
+ this.checked = true;
20
+
21
+ try {
22
+ this.marknative = require('marknative');
23
+ } catch (error) {
24
+ this.marknative = null;
25
+ console.error('MarkNative 加载失败:', error.message);
26
+ }
27
+ }
28
+
29
+ tools = {
30
+ marknative_render: {
31
+ description: '将 Markdown 渲染为图片(Base64 编码返回)',
32
+ inputSchema: z.object({
33
+ markdown: z.string().describe('Markdown 内容'),
34
+ format: z.enum(['png', 'svg']).optional().describe('输出格式:png 或 svg,默认 png'),
35
+ theme: z.string().optional().describe('主题:default, github, solarized, sepia, rose, dark, nord, dracula, ocean, forest'),
36
+ singlePage: z.boolean().optional().describe('是否渲染为单张图片(默认 false)'),
37
+ codeTheme: z.string().optional().describe('代码高亮主题(如 github-dark, nord 等)'),
38
+ }),
39
+ execute: async (args) => {
40
+ try {
41
+ await this._ensureMarkNative();
42
+
43
+ if (!this.marknative) {
44
+ return {
45
+ success: false,
46
+ error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
47
+ };
48
+ }
49
+
50
+ const { renderMarkdown } = this.marknative;
51
+
52
+ const options = {
53
+ format: args.format || 'png',
54
+ singlePage: args.singlePage || false
55
+ };
56
+
57
+ if (args.theme) options.theme = args.theme;
58
+ if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
59
+
60
+ const pages = await renderMarkdown(args.markdown, options);
61
+
62
+ if (pages.length === 0) {
63
+ return { success: false, error: '渲染失败,无输出' };
64
+ }
65
+
66
+ const page = pages[0];
67
+ return {
68
+ success: true,
69
+ pageCount: pages.length,
70
+ format: page.format,
71
+ data: page.format === 'png' ? page.data.toString('base64') : page.data,
72
+ isBase64: page.format === 'png',
73
+ message: page.format === 'png' ? 'PNG 图片已生成' : 'SVG 已生成'
74
+ };
75
+ } catch (error) {
76
+ return { success: false, error: error.message };
77
+ }
78
+ },
79
+ },
80
+
81
+ marknative_render_to_file: {
82
+ description: '将 Markdown 渲染为图片并保存到文件',
83
+ inputSchema: z.object({
84
+ markdown: z.string().describe('Markdown 内容'),
85
+ outputPath: z.string().describe('输出文件路径(如 output.png)'),
86
+ format: z.enum(['png', 'svg']).optional().describe('输出格式,默认根据文件扩展名'),
87
+ theme: z.string().optional().describe('主题'),
88
+ codeTheme: z.string().optional().describe('代码高亮主题'),
89
+ }),
90
+ execute: async (args) => {
91
+ try {
92
+ await this._ensureMarkNative();
93
+
94
+ if (!this.marknative) {
95
+ return {
96
+ success: false,
97
+ error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
98
+ };
99
+ }
100
+
101
+ const { renderMarkdown } = this.marknative;
102
+
103
+ const ext = path.extname(args.outputPath).toLowerCase();
104
+ const format = args.format || (ext === '.svg' ? 'svg' : 'png');
105
+
106
+ const options = { format };
107
+ if (args.theme) options.theme = args.theme;
108
+ if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
109
+
110
+ const pages = await renderMarkdown(args.markdown, options);
111
+
112
+ const dir = path.dirname(args.outputPath);
113
+ if (dir && dir !== '.' && !fs.existsSync(dir)) {
114
+ fs.mkdirSync(dir, { recursive: true });
115
+ }
116
+
117
+ const files = [];
118
+ for (let i = 0; i < pages.length; i++) {
119
+ const page = pages[i];
120
+ const filePath = pages.length === 1
121
+ ? args.outputPath
122
+ : args.outputPath.replace(/(\.[^.]+)$/, `-${String(i + 1).padStart(2, '0')}$1`);
123
+
124
+ if (page.format === 'png') {
125
+ fs.writeFileSync(filePath, page.data);
126
+ } else {
127
+ fs.writeFileSync(filePath, page.data, 'utf-8');
128
+ }
129
+ files.push(filePath);
130
+ }
131
+
132
+ return {
133
+ success: true,
134
+ files,
135
+ pageCount: pages.length,
136
+ message: `已生成 ${pages.length} 页图片: ${files.join(', ')}`
137
+ };
138
+ } catch (error) {
139
+ return { success: false, error: error.message };
140
+ }
141
+ },
142
+ },
143
+
144
+ marknative_preview: {
145
+ description: '预览 Markdown 渲染效果(返回第一页 Base64)',
146
+ inputSchema: z.object({
147
+ markdown: z.string().describe('Markdown 内容'),
148
+ theme: z.string().optional().describe('主题'),
149
+ codeTheme: z.string().optional().describe('代码高亮主题'),
150
+ }),
151
+ execute: async (args) => {
152
+ try {
153
+ await this._ensureMarkNative();
154
+
155
+ if (!this.marknative) {
156
+ return {
157
+ success: false,
158
+ error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
159
+ };
160
+ }
161
+
162
+ const { renderMarkdown } = this.marknative;
163
+
164
+ const options = {
165
+ format: 'png',
166
+ singlePage: true
167
+ };
168
+
169
+ if (args.theme) options.theme = args.theme;
170
+ if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
171
+
172
+ const pages = await renderMarkdown(args.markdown, options);
173
+
174
+ if (pages.length === 0) {
175
+ return { success: false, error: '预览生成失败' };
176
+ }
177
+
178
+ return {
179
+ success: true,
180
+ preview: pages[0].data.toString('base64'),
181
+ format: 'png'
182
+ };
183
+ } catch (error) {
184
+ return { success: false, error: error.message };
185
+ }
186
+ },
187
+ },
188
+
189
+ marknative_get_themes: {
190
+ description: '获取所有可用的主题列表',
191
+ inputSchema: z.object({}),
192
+ execute: async () => {
193
+ return {
194
+ success: true,
195
+ themes: [
196
+ { name: 'default', description: '默认主题(浅色)' },
197
+ { name: 'github', description: 'GitHub 风格' },
198
+ { name: 'solarized', description: 'Solarized 风格' },
199
+ { name: 'sepia', description: '复古纸张风格' },
200
+ { name: 'rose', description: '玫瑰粉风格' },
201
+ { name: 'dark', description: '深色主题' },
202
+ { name: 'nord', description: 'Nord 风格' },
203
+ { name: 'dracula', description: 'Dracula 风格' },
204
+ { name: 'ocean', description: '海洋风格' },
205
+ { name: 'forest', description: '森林风格' }
206
+ ],
207
+ codeThemes: ['github-light', 'github-dark', 'nord', 'dracula', 'solarized-light', 'solarized-dark', 'monokai']
208
+ };
209
+ },
210
+ },
211
+
212
+ marknative_status: {
213
+ description: '检查 marknative 插件状态',
214
+ inputSchema: z.object({}),
215
+ execute: async () => {
216
+ await this._ensureMarkNative();
217
+
218
+ return {
219
+ success: true,
220
+ available: this.marknative !== null,
221
+ message: this.marknative ? 'marknative 已就绪' : 'marknative 未安装,请运行: cd .agent/plugins/marknative && npm install'
222
+ };
223
+ },
224
+ },
225
+ };
226
+
227
+ install(framework) {
228
+ return this;
229
+ }
230
+
231
+ uninstall(framework) {}
232
+ };
233
+ };
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "marknative-plugin",
3
+ "version": "1.0.0",
4
+ "description": "Markdown 转图片插件 - 将 Markdown 转换为 PNG/SVG",
5
+ "main": "index.js",
6
+ "keywords": ["markdown", "png", "svg", "image", "render", "foliko", "plugin"],
7
+ "author": "",
8
+ "license": "MIT",
9
+ "dependencies": {
10
+ "marknative": "^0.2.0"
11
+ }
12
+ }
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 更新仓库 README 的脚本
5
+ * 读取所有插件目录,生成插件列表表格
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+
11
+ const REPO_DIR = path.join(__dirname, '..', '..', '..');
12
+ const README_PATH = path.join(REPO_DIR, 'README.md');
13
+
14
+ // 插件信息
15
+ const plugins = [];
16
+
17
+ function getPluginInfo(pluginPath) {
18
+ const indexPath = path.join(pluginPath, 'index.js');
19
+ const readmePath = path.join(pluginPath, 'README.md');
20
+
21
+ let name = path.basename(pluginPath);
22
+ let description = '暂无描述';
23
+ let tools = [];
24
+
25
+ // 读取 README
26
+ if (fs.existsSync(readmePath)) {
27
+ const content = fs.readFileSync(readmePath, 'utf-8');
28
+ const descMatch = content.match(/^#\s+(.+)$/m);
29
+ if (descMatch) {
30
+ description = descMatch[1];
31
+ }
32
+ }
33
+
34
+ // 读取 index.js 获取工具列表
35
+ if (fs.existsSync(indexPath)) {
36
+ const content = fs.readFileSync(indexPath, 'utf-8');
37
+ const toolMatches = content.match(/^\s{2}(\w+):\s*\{\s*description:/gm);
38
+ if (toolMatches) {
39
+ tools = toolMatches.map(m => m.match(/\s{2}(\w+):/)[1]);
40
+ }
41
+ }
42
+
43
+ return { name, description, tools };
44
+ }
45
+
46
+ // 扫描插件目录
47
+ function scanPlugins() {
48
+ const pluginsDir = path.join(REPO_DIR);
49
+
50
+ if (!fs.existsSync(pluginsDir)) {
51
+ console.error('Plugins directory not found:', pluginsDir);
52
+ return;
53
+ }
54
+
55
+ const entries = fs.readdirSync(pluginsDir, { withFileTypes: true });
56
+
57
+ for (const entry of entries) {
58
+ if (entry.isDirectory() && !entry.name.startsWith('.')) {
59
+ const pluginPath = path.join(pluginsDir, entry.name);
60
+ const indexPath = path.join(pluginPath, 'index.js');
61
+
62
+ if (fs.existsSync(indexPath)) {
63
+ const info = getPluginInfo(pluginPath);
64
+ plugins.push(info);
65
+ console.log(`Found plugin: ${info.name}`);
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+ // 生成 README 内容
72
+ function generateReadme() {
73
+ const pluginTable = plugins.map(p => {
74
+ const toolList = p.tools.length > 0
75
+ ? p.tools.map(t => `| \`${t}\` | - |`).join('\n')
76
+ : '| - | - |';
77
+
78
+ return `## ${p.name.charAt(0).toUpperCase() + p.name.slice(1).replace(/-/g, ' ')}\n\n${p.description}\n\n### 工具\n\n| 工具 | 描述 |\n|------|------|\n${toolList}\n`;
79
+ }).join('\n---\n\n');
80
+
81
+ const pluginListTable = plugins.map(p => {
82
+ const name = p.name.charAt(0).toUpperCase() + p.name.slice(1).replace(/-/g, ' ');
83
+ return `| [\`${p.name}\`](#${p.name.toLowerCase()}) | ${p.description} | ✅ 可用 |`;
84
+ }).join('\n');
85
+
86
+ const pluginToolsTable = plugins.map(p => {
87
+ return `### ${p.name}\n\n| 工具 | 描述 |\n|------|------|\n${p.tools.map(t => `| \`${t}\` | - |`).join('\n')}\n`;
88
+ }).join('\n---\n\n');
89
+
90
+ return `# Foliko Plugins
91
+
92
+ Foliko Agent 框架的插件仓库,为 Foliko 提供扩展功能。
93
+
94
+ ## 插件列表
95
+
96
+ | 插件 | 描述 | 状态 |
97
+ |------|------|------|
98
+ ${pluginListTable}
99
+
100
+ ${pluginToolsTable}
101
+
102
+ ## 安装所有插件
103
+
104
+ \`\`\`bash
105
+ ${plugins.map(p => `folko plugin install ${p.name}`).join('\n')}
106
+ folko reload
107
+ \`\`\`
108
+
109
+ ## 许可证
110
+
111
+ Apache-2.0
112
+ `;
113
+ }
114
+
115
+ // 主函数
116
+ function main() {
117
+ console.log('Scanning plugins...');
118
+ scanPlugins();
119
+
120
+ console.log(`\nFound ${plugins.length} plugins`);
121
+
122
+ if (plugins.length === 0) {
123
+ console.log('No plugins found, skipping README update');
124
+ return;
125
+ }
126
+
127
+ console.log('\nGenerating README...');
128
+ const content = generateReadme();
129
+
130
+ fs.writeFileSync(README_PATH, content, 'utf-8');
131
+ console.log(`README updated: ${README_PATH}`);
132
+ }
133
+
134
+ main();