foliko 1.0.85 → 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 (169) 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/test_plugin.py +304 -0
  27. package/.agent/plugins.json +14 -5
  28. package/.agent/python-scripts/test_sample.py +24 -0
  29. package/.agent/skills/agent-browser/SKILL.md +311 -0
  30. package/.agent/skills/agent-browser/TEST_PLAN.md +200 -0
  31. package/.agent/skills/sysinfo/SKILL.md +38 -0
  32. package/.agent/skills/sysinfo/system-info.sh +130 -0
  33. package/.agent/skills/workflow/SKILL.md +324 -0
  34. package/.agent/workflows/email-digest.json +50 -0
  35. package/.agent/workflows/file-backup.json +21 -0
  36. package/.agent/workflows/get-ip-notify.json +32 -0
  37. package/.agent/workflows/news-aggregator.json +93 -0
  38. package/.agent/workflows/news-dashboard-v2.json +94 -0
  39. package/.agent/workflows/notification-batch.json +32 -0
  40. package/.claude/settings.local.json +171 -178
  41. package/.env.example +56 -56
  42. package/README.md +441 -441
  43. package/package.json +2 -2
  44. package/plugins/ambient-agent/EventWatcher.js +4 -4
  45. package/plugins/extension-executor-plugin.js +44 -1
  46. package/plugins/file-system-plugin.js +44 -5
  47. package/plugins/weixin-plugin.js +278 -29
  48. package/skills/find-skills/AGENTS.md +162 -162
  49. package/skills/find-skills/SKILL.md +133 -133
  50. package/skills/foliko-dev/SKILL.md +67 -0
  51. package/skills/python-plugin-dev/SKILL.md +238 -238
  52. package/src/core/agent-chat.js +4 -3
  53. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +0 -26
  54. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +0 -97
  55. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +0 -101
  56. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +0 -31
  57. package/.agent/.shared/ui-ux-pro-max/data/products.csv +0 -97
  58. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +0 -24
  59. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +0 -45
  60. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  61. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  62. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  63. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  64. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -51
  65. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  66. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  67. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -54
  68. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  69. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  70. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  71. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  72. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +0 -59
  73. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +0 -58
  74. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  75. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  76. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +0 -31
  77. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  78. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  79. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +0 -258
  80. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +0 -1067
  81. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +0 -106
  82. package/.agent/ARCHITECTURE.md +0 -288
  83. package/.agent/agents/ambient-agent.md +0 -57
  84. package/.agent/agents/debugger.md +0 -55
  85. package/.agent/agents/email-assistant.md +0 -49
  86. package/.agent/agents/file-manager.md +0 -42
  87. package/.agent/agents/python-developer.md +0 -60
  88. package/.agent/agents/scheduler.md +0 -59
  89. package/.agent/agents/web-developer.md +0 -45
  90. package/.agent/data/puppeteer-sessions/undefined.json +0 -6
  91. package/.agent/mcp_config_updated.json +0 -12
  92. package/.agent/rules/GEMINI.md +0 -273
  93. package/.agent/rules/allow-rule.md +0 -77
  94. package/.agent/rules/log-rule.md +0 -83
  95. package/.agent/rules/security-rule.md +0 -93
  96. package/.agent/scripts/auto_preview.py +0 -148
  97. package/.agent/scripts/checklist.py +0 -217
  98. package/.agent/scripts/session_manager.py +0 -120
  99. package/.agent/scripts/verify_all.py +0 -327
  100. package/.agent/skills/api-patterns/SKILL.md +0 -81
  101. package/.agent/skills/api-patterns/api-style.md +0 -42
  102. package/.agent/skills/api-patterns/auth.md +0 -24
  103. package/.agent/skills/api-patterns/documentation.md +0 -26
  104. package/.agent/skills/api-patterns/graphql.md +0 -41
  105. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  106. package/.agent/skills/api-patterns/response.md +0 -37
  107. package/.agent/skills/api-patterns/rest.md +0 -40
  108. package/.agent/skills/api-patterns/scripts/api_validator.py +0 -211
  109. package/.agent/skills/api-patterns/security-testing.md +0 -122
  110. package/.agent/skills/api-patterns/trpc.md +0 -41
  111. package/.agent/skills/api-patterns/versioning.md +0 -22
  112. package/.agent/skills/app-builder/SKILL.md +0 -75
  113. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  114. package/.agent/skills/app-builder/feature-building.md +0 -53
  115. package/.agent/skills/app-builder/project-detection.md +0 -34
  116. package/.agent/skills/app-builder/scaffolding.md +0 -118
  117. package/.agent/skills/app-builder/tech-stack.md +0 -40
  118. package/.agent/skills/app-builder/templates/SKILL.md +0 -39
  119. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
  120. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
  121. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
  122. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
  123. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
  124. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
  125. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
  126. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
  127. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
  128. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
  129. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
  130. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
  131. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
  132. package/.agent/skills/architecture/SKILL.md +0 -55
  133. package/.agent/skills/architecture/context-discovery.md +0 -43
  134. package/.agent/skills/architecture/examples.md +0 -94
  135. package/.agent/skills/architecture/pattern-selection.md +0 -68
  136. package/.agent/skills/architecture/patterns-reference.md +0 -50
  137. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  138. package/.agent/skills/clean-code/SKILL.md +0 -201
  139. package/.agent/skills/doc.md +0 -177
  140. package/.agent/skills/frontend-design/SKILL.md +0 -418
  141. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  142. package/.agent/skills/frontend-design/color-system.md +0 -311
  143. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  144. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  145. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +0 -183
  146. package/.agent/skills/frontend-design/scripts/ux_audit.py +0 -722
  147. package/.agent/skills/frontend-design/typography-system.md +0 -345
  148. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  149. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  150. package/.agent/skills/i18n-localization/SKILL.md +0 -154
  151. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +0 -241
  152. package/.agent/skills/mcp-builder/SKILL.md +0 -176
  153. package/.agent/skills/web-design-guidelines/SKILL.md +0 -57
  154. package/.agent/workflows/brainstorm.md +0 -113
  155. package/.agent/workflows/create.md +0 -59
  156. package/.agent/workflows/debug.md +0 -103
  157. package/.agent/workflows/deploy.md +0 -176
  158. package/.agent/workflows/enhance.md +0 -63
  159. package/.agent/workflows/orchestrate.md +0 -237
  160. package/.agent/workflows/plan.md +0 -89
  161. package/.agent/workflows/preview.md +0 -81
  162. package/.agent/workflows/simple-test.md +0 -42
  163. package/.agent/workflows/status.md +0 -86
  164. package/.agent/workflows/structured-orchestrate.md +0 -180
  165. package/.agent/workflows/test.md +0 -144
  166. package/.agent/workflows/ui-ux-pro-max.md +0 -296
  167. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/README.md +0 -0
  168. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/index.js +0 -0
  169. /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();