foliko 1.0.85 → 1.0.87

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 (178) 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 +21 -311
  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 +228 -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 +8 -7
  41. package/.env.example +56 -56
  42. package/README.md +441 -441
  43. package/examples/test-chat-debug.js +102 -0
  44. package/examples/test-chat-result.js +76 -0
  45. package/examples/test-chat-stream-diff.js +63 -0
  46. package/examples/test-concurrent-chat.js +60 -0
  47. package/examples/test-long-chat.js +77 -0
  48. package/examples/test-session-chat.js +93 -0
  49. package/package.json +2 -2
  50. package/plugins/ambient-agent/EventWatcher.js +4 -4
  51. package/plugins/extension-executor-plugin.js +44 -1
  52. package/plugins/file-system-plugin.js +44 -5
  53. package/plugins/session-plugin.js +21 -0
  54. package/plugins/weixin-plugin.js +278 -29
  55. package/skills/find-skills/AGENTS.md +162 -162
  56. package/skills/find-skills/SKILL.md +133 -133
  57. package/skills/foliko-dev/SKILL.md +67 -0
  58. package/skills/python-plugin-dev/SKILL.md +238 -238
  59. package/src/core/agent-chat.js +106 -58
  60. package/src/core/agent.js +3 -61
  61. package/src/utils/index.js +1 -1
  62. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +0 -26
  63. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +0 -97
  64. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +0 -101
  65. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +0 -31
  66. package/.agent/.shared/ui-ux-pro-max/data/products.csv +0 -97
  67. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +0 -24
  68. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +0 -45
  69. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  70. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  71. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  72. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  73. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -51
  74. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  75. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  76. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -54
  77. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  78. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  79. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  80. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  81. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +0 -59
  82. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +0 -58
  83. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  84. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  85. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +0 -31
  86. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  87. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  88. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +0 -258
  89. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +0 -1067
  90. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +0 -106
  91. package/.agent/ARCHITECTURE.md +0 -288
  92. package/.agent/agents/ambient-agent.md +0 -57
  93. package/.agent/agents/debugger.md +0 -55
  94. package/.agent/agents/email-assistant.md +0 -49
  95. package/.agent/agents/file-manager.md +0 -42
  96. package/.agent/agents/python-developer.md +0 -60
  97. package/.agent/agents/scheduler.md +0 -59
  98. package/.agent/agents/web-developer.md +0 -45
  99. package/.agent/data/puppeteer-sessions/undefined.json +0 -6
  100. package/.agent/mcp_config_updated.json +0 -12
  101. package/.agent/rules/GEMINI.md +0 -273
  102. package/.agent/rules/allow-rule.md +0 -77
  103. package/.agent/rules/log-rule.md +0 -83
  104. package/.agent/rules/security-rule.md +0 -93
  105. package/.agent/scripts/auto_preview.py +0 -148
  106. package/.agent/scripts/checklist.py +0 -217
  107. package/.agent/scripts/session_manager.py +0 -120
  108. package/.agent/scripts/verify_all.py +0 -327
  109. package/.agent/skills/api-patterns/SKILL.md +0 -81
  110. package/.agent/skills/api-patterns/api-style.md +0 -42
  111. package/.agent/skills/api-patterns/auth.md +0 -24
  112. package/.agent/skills/api-patterns/documentation.md +0 -26
  113. package/.agent/skills/api-patterns/graphql.md +0 -41
  114. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  115. package/.agent/skills/api-patterns/response.md +0 -37
  116. package/.agent/skills/api-patterns/rest.md +0 -40
  117. package/.agent/skills/api-patterns/scripts/api_validator.py +0 -211
  118. package/.agent/skills/api-patterns/security-testing.md +0 -122
  119. package/.agent/skills/api-patterns/trpc.md +0 -41
  120. package/.agent/skills/api-patterns/versioning.md +0 -22
  121. package/.agent/skills/app-builder/SKILL.md +0 -75
  122. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  123. package/.agent/skills/app-builder/feature-building.md +0 -53
  124. package/.agent/skills/app-builder/project-detection.md +0 -34
  125. package/.agent/skills/app-builder/scaffolding.md +0 -118
  126. package/.agent/skills/app-builder/tech-stack.md +0 -40
  127. package/.agent/skills/app-builder/templates/SKILL.md +0 -39
  128. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
  129. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
  130. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
  131. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
  132. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
  133. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
  134. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
  135. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
  136. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
  137. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
  138. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
  139. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
  140. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
  141. package/.agent/skills/architecture/SKILL.md +0 -55
  142. package/.agent/skills/architecture/context-discovery.md +0 -43
  143. package/.agent/skills/architecture/examples.md +0 -94
  144. package/.agent/skills/architecture/pattern-selection.md +0 -68
  145. package/.agent/skills/architecture/patterns-reference.md +0 -50
  146. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  147. package/.agent/skills/clean-code/SKILL.md +0 -201
  148. package/.agent/skills/doc.md +0 -177
  149. package/.agent/skills/frontend-design/SKILL.md +0 -418
  150. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  151. package/.agent/skills/frontend-design/color-system.md +0 -311
  152. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  153. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  154. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +0 -183
  155. package/.agent/skills/frontend-design/scripts/ux_audit.py +0 -722
  156. package/.agent/skills/frontend-design/typography-system.md +0 -345
  157. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  158. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  159. package/.agent/skills/i18n-localization/SKILL.md +0 -154
  160. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +0 -241
  161. package/.agent/skills/mcp-builder/SKILL.md +0 -176
  162. package/.agent/skills/web-design-guidelines/SKILL.md +0 -57
  163. package/.agent/workflows/brainstorm.md +0 -113
  164. package/.agent/workflows/create.md +0 -59
  165. package/.agent/workflows/debug.md +0 -103
  166. package/.agent/workflows/deploy.md +0 -176
  167. package/.agent/workflows/enhance.md +0 -63
  168. package/.agent/workflows/orchestrate.md +0 -237
  169. package/.agent/workflows/plan.md +0 -89
  170. package/.agent/workflows/preview.md +0 -81
  171. package/.agent/workflows/simple-test.md +0 -42
  172. package/.agent/workflows/status.md +0 -86
  173. package/.agent/workflows/structured-orchestrate.md +0 -180
  174. package/.agent/workflows/test.md +0 -144
  175. package/.agent/workflows/ui-ux-pro-max.md +0 -296
  176. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/README.md +0 -0
  177. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/index.js +0 -0
  178. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/package.json +0 -0
@@ -0,0 +1,228 @@
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.1';
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
+ this.marknative = await import('marknative');
22
+ }
23
+
24
+ tools = {
25
+ marknative_render: {
26
+ description: '将 Markdown 渲染为图片(Base64 编码返回)',
27
+ inputSchema: z.object({
28
+ markdown: z.string().describe('Markdown 内容'),
29
+ format: z.enum(['png', 'svg']).optional().describe('输出格式:png 或 svg,默认 png'),
30
+ theme: z.string().optional().describe('主题:default, github, solarized, sepia, rose, dark, nord, dracula, ocean, forest'),
31
+ singlePage: z.boolean().optional().describe('是否渲染为单张图片(默认 false)'),
32
+ codeTheme: z.string().optional().describe('代码高亮主题(如 github-dark, nord 等)'),
33
+ }),
34
+ execute: async (args) => {
35
+ try {
36
+ await this._ensureMarkNative();
37
+
38
+ if (!this.marknative) {
39
+ return {
40
+ success: false,
41
+ error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
42
+ };
43
+ }
44
+
45
+ const { renderMarkdown } = this.marknative;
46
+
47
+ const options = {
48
+ format: args.format || 'png',
49
+ singlePage: args.singlePage || false
50
+ };
51
+
52
+ if (args.theme) options.theme = args.theme;
53
+ if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
54
+
55
+ const pages = await renderMarkdown(args.markdown, options);
56
+
57
+ if (pages.length === 0) {
58
+ return { success: false, error: '渲染失败,无输出' };
59
+ }
60
+
61
+ const page = pages[0];
62
+ return {
63
+ success: true,
64
+ pageCount: pages.length,
65
+ format: page.format,
66
+ data: page.format === 'png' ? page.data.toString('base64') : page.data,
67
+ isBase64: page.format === 'png',
68
+ message: page.format === 'png' ? 'PNG 图片已生成' : 'SVG 已生成'
69
+ };
70
+ } catch (error) {
71
+ return { success: false, error: error.message };
72
+ }
73
+ },
74
+ },
75
+
76
+ marknative_render_to_file: {
77
+ description: '将 Markdown 渲染为图片并保存到文件',
78
+ inputSchema: z.object({
79
+ markdown: z.string().describe('Markdown 内容'),
80
+ outputPath: z.string().describe('输出文件路径(如 output.png)'),
81
+ format: z.enum(['png', 'svg']).optional().describe('输出格式,默认根据文件扩展名'),
82
+ theme: z.string().optional().describe('主题'),
83
+ codeTheme: z.string().optional().describe('代码高亮主题'),
84
+ }),
85
+ execute: async (args) => {
86
+ try {
87
+ await this._ensureMarkNative();
88
+
89
+ if (!this.marknative) {
90
+ return {
91
+ success: false,
92
+ error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
93
+ };
94
+ }
95
+
96
+ const { renderMarkdown } = this.marknative;
97
+
98
+ const ext = path.extname(args.outputPath).toLowerCase();
99
+ const format = args.format || (ext === '.svg' ? 'svg' : 'png');
100
+
101
+ const options = { format };
102
+ if (args.theme) options.theme = args.theme;
103
+ if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
104
+
105
+ const pages = await renderMarkdown(args.markdown, options);
106
+
107
+ const dir = path.dirname(args.outputPath);
108
+ if (dir && dir !== '.' && !fs.existsSync(dir)) {
109
+ fs.mkdirSync(dir, { recursive: true });
110
+ }
111
+
112
+ const files = [];
113
+ for (let i = 0; i < pages.length; i++) {
114
+ const page = pages[i];
115
+ const filePath = pages.length === 1
116
+ ? args.outputPath
117
+ : args.outputPath.replace(/(\.[^.]+)$/, `-${String(i + 1).padStart(2, '0')}$1`);
118
+
119
+ if (page.format === 'png') {
120
+ fs.writeFileSync(filePath, page.data);
121
+ } else {
122
+ fs.writeFileSync(filePath, page.data, 'utf-8');
123
+ }
124
+ files.push(filePath);
125
+ }
126
+
127
+ return {
128
+ success: true,
129
+ files,
130
+ pageCount: pages.length,
131
+ message: `已生成 ${pages.length} 页图片: ${files.join(', ')}`
132
+ };
133
+ } catch (error) {
134
+ return { success: false, error: error.message };
135
+ }
136
+ },
137
+ },
138
+
139
+ marknative_preview: {
140
+ description: '预览 Markdown 渲染效果(返回第一页 Base64)',
141
+ inputSchema: z.object({
142
+ markdown: z.string().describe('Markdown 内容'),
143
+ theme: z.string().optional().describe('主题'),
144
+ codeTheme: z.string().optional().describe('代码高亮主题'),
145
+ }),
146
+ execute: async (args) => {
147
+ try {
148
+ await this._ensureMarkNative();
149
+
150
+ if (!this.marknative) {
151
+ return {
152
+ success: false,
153
+ error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
154
+ };
155
+ }
156
+
157
+ const { renderMarkdown } = this.marknative;
158
+
159
+ const options = {
160
+ format: 'png',
161
+ singlePage: true
162
+ };
163
+
164
+ if (args.theme) options.theme = args.theme;
165
+ if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
166
+
167
+ const pages = await renderMarkdown(args.markdown, options);
168
+
169
+ if (pages.length === 0) {
170
+ return { success: false, error: '预览生成失败' };
171
+ }
172
+
173
+ return {
174
+ success: true,
175
+ preview: pages[0].data.toString('base64'),
176
+ format: 'png'
177
+ };
178
+ } catch (error) {
179
+ return { success: false, error: error.message };
180
+ }
181
+ },
182
+ },
183
+
184
+ marknative_get_themes: {
185
+ description: '获取所有可用的主题列表',
186
+ inputSchema: z.object({}),
187
+ execute: async () => {
188
+ return {
189
+ success: true,
190
+ themes: [
191
+ { name: 'default', description: '默认主题(浅色)' },
192
+ { name: 'github', description: 'GitHub 风格' },
193
+ { name: 'solarized', description: 'Solarized 风格' },
194
+ { name: 'sepia', description: '复古纸张风格' },
195
+ { name: 'rose', description: '玫瑰粉风格' },
196
+ { name: 'dark', description: '深色主题' },
197
+ { name: 'nord', description: 'Nord 风格' },
198
+ { name: 'dracula', description: 'Dracula 风格' },
199
+ { name: 'ocean', description: '海洋风格' },
200
+ { name: 'forest', description: '森林风格' }
201
+ ],
202
+ codeThemes: ['github-light', 'github-dark', 'nord', 'dracula', 'solarized-light', 'solarized-dark', 'monokai']
203
+ };
204
+ },
205
+ },
206
+
207
+ marknative_status: {
208
+ description: '检查 marknative 插件状态',
209
+ inputSchema: z.object({}),
210
+ execute: async () => {
211
+ await this._ensureMarkNative();
212
+
213
+ return {
214
+ success: true,
215
+ available: this.marknative !== null,
216
+ message: this.marknative ? 'marknative 已就绪' : 'marknative 未安装,请运行: cd .agent/plugins/marknative && npm install'
217
+ };
218
+ },
219
+ },
220
+ };
221
+
222
+ install(framework) {
223
+ return this;
224
+ }
225
+
226
+ uninstall(framework) {}
227
+ };
228
+ };
@@ -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();