foliko 1.1.0 → 1.1.2

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 (214) hide show
  1. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
  2. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
  3. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
  4. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
  5. package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
  6. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
  7. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
  8. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  9. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  10. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  11. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  12. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  13. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  14. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  15. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
  16. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  17. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  18. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  19. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  20. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
  21. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
  22. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  23. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  24. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
  25. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  26. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  27. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
  28. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
  29. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
  30. package/.agent/ARCHITECTURE.md +288 -0
  31. package/.agent/agents/ambient-agent.md +57 -0
  32. package/.agent/agents/debugger.md +55 -0
  33. package/.agent/agents/email-assistant.md +49 -0
  34. package/.agent/agents/file-manager.md +42 -0
  35. package/.agent/agents/python-developer.md +60 -0
  36. package/.agent/agents/scheduler.md +59 -0
  37. package/.agent/agents/web-developer.md +45 -0
  38. package/.agent/data/default.json +412 -3
  39. package/.agent/data/plugins-state.json +173 -174
  40. package/.agent/data/puppeteer-sessions/undefined.json +6 -0
  41. package/.agent/data/weixin-media/2026-04-08/img_1775618677512.jpg +0 -0
  42. package/.agent/data/weixin-media/2026-04-08/img_1775619073340.jpg +0 -0
  43. package/.agent/data/weixin-media/2026-04-08/img_1775619097536.jpg +0 -0
  44. package/.agent/data/weixin-media/2026-04-08/img_1775619209388.jpg +0 -0
  45. package/.agent/mcp_config_updated.json +12 -0
  46. package/.agent/plugins/poster-plugin/fonts/NotoColorEmoji-Regular.ttf +0 -0
  47. package/.agent/plugins/poster-plugin/package.json +2 -1
  48. package/.agent/plugins/poster-plugin/src/canvas.js +70 -7
  49. package/.agent/plugins/poster-plugin/src/components/barcode.js +120 -0
  50. package/.agent/plugins/poster-plugin/src/components/bubble.js +153 -0
  51. package/.agent/plugins/poster-plugin/src/components/button.js +124 -0
  52. package/.agent/plugins/poster-plugin/src/components/cta.js +26 -24
  53. package/.agent/plugins/poster-plugin/src/components/featureGrid.js +22 -17
  54. package/.agent/plugins/poster-plugin/src/components/frame.js +230 -0
  55. package/.agent/plugins/poster-plugin/src/components/highlightText.js +144 -0
  56. package/.agent/plugins/poster-plugin/src/components/icon.js +94 -0
  57. package/.agent/plugins/poster-plugin/src/components/index.js +19 -0
  58. package/.agent/plugins/poster-plugin/src/components/listItem.js +6 -5
  59. package/.agent/plugins/poster-plugin/src/components/qrcode.js +74 -0
  60. package/.agent/plugins/poster-plugin/src/components/ribbon.js +193 -0
  61. package/.agent/plugins/poster-plugin/src/components/seal.js +146 -0
  62. package/.agent/plugins/poster-plugin/src/components/table.js +17 -9
  63. package/.agent/plugins/poster-plugin/src/components/tagCloud.js +24 -17
  64. package/.agent/plugins/poster-plugin/src/components/timeline.js +24 -12
  65. package/.agent/plugins/poster-plugin/src/composer.js +392 -150
  66. package/.agent/plugins/poster-plugin/src/elements/background.js +36 -4
  67. package/.agent/plugins/poster-plugin/src/elements/image.js +4 -47
  68. package/.agent/plugins/poster-plugin/src/elements/index.js +2 -0
  69. package/.agent/plugins/poster-plugin/src/elements/polygon.js +37 -6
  70. package/.agent/plugins/poster-plugin/src/elements/richText.js +230 -0
  71. package/.agent/plugins/poster-plugin/src/elements/svg.js +35 -19
  72. package/.agent/plugins/poster-plugin/src/elements/text.js +71 -2
  73. package/.agent/plugins/poster-plugin/src/fonts.js +123 -8
  74. package/.agent/plugins/poster-plugin/src/index.js +445 -23
  75. package/.agent/plugins/poster-plugin/src/utils/imageLoader.js +84 -0
  76. package/.agent/plugins/poster-plugin/test-background.svg +1 -0
  77. package/.agent/plugins/poster-plugin/test-full-poster.svg +2 -0
  78. package/.agent/plugins/poster-plugin/test-image.png +0 -0
  79. package/.agent/plugins/puppeteer-plugin/README.md +147 -0
  80. package/.agent/plugins/puppeteer-plugin/index.js +1418 -0
  81. package/.agent/plugins/puppeteer-plugin/package.json +9 -0
  82. package/.agent/plugins.json +5 -11
  83. package/.agent/rules/GEMINI.md +273 -0
  84. package/.agent/rules/allow-rule.md +77 -0
  85. package/.agent/rules/log-rule.md +83 -0
  86. package/.agent/rules/security-rule.md +93 -0
  87. package/.agent/scripts/auto_preview.py +148 -0
  88. package/.agent/scripts/checklist.py +217 -0
  89. package/.agent/scripts/session_manager.py +120 -0
  90. package/.agent/scripts/verify_all.py +327 -0
  91. package/.agent/sessions/cli_default.json +678 -23580
  92. package/.agent/sessions/weixin_o9cq80zgZqKPA2-s59PN43GdDy1w@im.wechat.json +11097 -0
  93. package/.agent/skills/api-patterns/SKILL.md +81 -0
  94. package/.agent/skills/api-patterns/api-style.md +42 -0
  95. package/.agent/skills/api-patterns/auth.md +24 -0
  96. package/.agent/skills/api-patterns/documentation.md +26 -0
  97. package/.agent/skills/api-patterns/graphql.md +41 -0
  98. package/.agent/skills/api-patterns/rate-limiting.md +31 -0
  99. package/.agent/skills/api-patterns/response.md +37 -0
  100. package/.agent/skills/api-patterns/rest.md +40 -0
  101. package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  102. package/.agent/skills/api-patterns/security-testing.md +122 -0
  103. package/.agent/skills/api-patterns/trpc.md +41 -0
  104. package/.agent/skills/api-patterns/versioning.md +22 -0
  105. package/.agent/skills/app-builder/SKILL.md +75 -0
  106. package/.agent/skills/app-builder/agent-coordination.md +71 -0
  107. package/.agent/skills/app-builder/feature-building.md +53 -0
  108. package/.agent/skills/app-builder/project-detection.md +34 -0
  109. package/.agent/skills/app-builder/scaffolding.md +118 -0
  110. package/.agent/skills/app-builder/tech-stack.md +40 -0
  111. package/.agent/skills/app-builder/templates/SKILL.md +39 -0
  112. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  113. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  114. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  115. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  116. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  117. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  118. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  119. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
  120. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
  121. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
  122. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
  123. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  124. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
  125. package/.agent/skills/architecture/SKILL.md +55 -0
  126. package/.agent/skills/architecture/context-discovery.md +43 -0
  127. package/.agent/skills/architecture/examples.md +94 -0
  128. package/.agent/skills/architecture/pattern-selection.md +68 -0
  129. package/.agent/skills/architecture/patterns-reference.md +50 -0
  130. package/.agent/skills/architecture/trade-off-analysis.md +77 -0
  131. package/.agent/skills/clean-code/SKILL.md +201 -0
  132. package/.agent/skills/doc.md +177 -0
  133. package/.agent/skills/frontend-design/SKILL.md +418 -0
  134. package/.agent/skills/frontend-design/animation-guide.md +331 -0
  135. package/.agent/skills/frontend-design/color-system.md +311 -0
  136. package/.agent/skills/frontend-design/decision-trees.md +418 -0
  137. package/.agent/skills/frontend-design/motion-graphics.md +306 -0
  138. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  139. package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
  140. package/.agent/skills/frontend-design/typography-system.md +345 -0
  141. package/.agent/skills/frontend-design/ux-psychology.md +1116 -0
  142. package/.agent/skills/frontend-design/visual-effects.md +383 -0
  143. package/.agent/skills/i18n-localization/SKILL.md +154 -0
  144. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  145. package/.agent/skills/mcp-builder/SKILL.md +176 -0
  146. package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
  147. package/.agent/workflows/brainstorm.md +113 -0
  148. package/.agent/workflows/create.md +59 -0
  149. package/.agent/workflows/debug.md +103 -0
  150. package/.agent/workflows/deploy.md +176 -0
  151. package/.agent/workflows/enhance.md +63 -0
  152. package/.agent/workflows/orchestrate.md +237 -0
  153. package/.agent/workflows/plan.md +89 -0
  154. package/.agent/workflows/preview.md +81 -0
  155. package/.agent/workflows/simple-test.md +42 -0
  156. package/.agent/workflows/status.md +86 -0
  157. package/.agent/workflows/structured-orchestrate.md +180 -0
  158. package/.agent/workflows/test.md +144 -0
  159. package/.agent/workflows/ui-ux-pro-max.md +296 -0
  160. package/.claude/settings.local.json +21 -1
  161. package/.env.example +56 -56
  162. package/README.md +441 -441
  163. package/cli/src/commands/chat.js +2 -1
  164. package/output/international-news-daily.png +0 -0
  165. package/package.json +2 -1
  166. package/plugins/extension-executor-plugin.js +91 -12
  167. package/plugins/file-system-plugin.js +4 -19
  168. package/plugins/subagent-plugin.js +37 -14
  169. package/plugins/weixin-plugin.js +168 -40
  170. package/poster-test-2.png +0 -0
  171. package/skills/find-skills/AGENTS.md +162 -162
  172. package/skills/find-skills/SKILL.md +133 -133
  173. package/skills/poster-guide/SKILL.md +1435 -627
  174. package/src/core/agent-chat.js +223 -11
  175. package/src/core/agent.js +6 -3
  176. package/.agent/agents/code-assistant.json +0 -14
  177. package/.agent/agents/email-assistant.json +0 -14
  178. package/.agent/agents/file-assistant.json +0 -15
  179. package/.agent/agents/system-assistant.json +0 -15
  180. package/.agent/agents/web-assistant.json +0 -12
  181. package/.agent/data/ambient/goals.json +0 -50
  182. package/.agent/data/ambient/memories.json +0 -7
  183. package/.agent/data/scheduler/tasks.json +0 -1
  184. package/.agent/memory/core.md +0 -1
  185. package/.agent/memory/project/mnn93ogy-ypjn27.md +0 -9
  186. package/.agent/memory/project/mnn98fqy-5nhc1u.md +0 -25
  187. package/.agent/memory/user/mnm67t9m-x8rekk.md +0 -9
  188. package/.agent/memory/user/mnn5mmqh-w6aktx.md +0 -11
  189. package/.agent/memory/user/mnnbfhhn-dk1bd1.md +0 -22
  190. package/.agent/package.json +0 -8
  191. package/.agent/plugins/__pycache__/file_writer.cpython-312.pyc +0 -0
  192. package/.agent/plugins/daytona/README.md +0 -89
  193. package/.agent/plugins/daytona/index.js +0 -377
  194. package/.agent/plugins/daytona/package.json +0 -12
  195. package/.agent/plugins/marknative/README.md +0 -134
  196. package/.agent/plugins/marknative/index.js +0 -228
  197. package/.agent/plugins/marknative/package.json +0 -12
  198. package/.agent/plugins/marknative/update-readme.js +0 -134
  199. package/.agent/plugins/system-info/index.js +0 -387
  200. package/.agent/plugins/system-info/package.json +0 -4
  201. package/.agent/plugins/system-info/test.js +0 -40
  202. package/.agent/python-scripts/test_sample.py +0 -24
  203. package/.agent/skills/agent-browser/SKILL.md +0 -311
  204. package/.agent/skills/agent-browser/TEST_PLAN.md +0 -200
  205. package/.agent/skills/sysinfo/SKILL.md +0 -38
  206. package/.agent/skills/sysinfo/system-info.sh +0 -130
  207. package/.agent/skills/workflow/SKILL.md +0 -324
  208. package/.agent/weixin.json +0 -6
  209. package/.agent/workflows/email-digest.json +0 -50
  210. package/.agent/workflows/file-backup.json +0 -21
  211. package/.agent/workflows/get-ip-notify.json +0 -32
  212. package/.agent/workflows/news-aggregator.json +0 -93
  213. package/.agent/workflows/news-dashboard-v2.json +0 -94
  214. package/.agent/workflows/notification-batch.json +0 -32
@@ -1,228 +0,0 @@
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
- };
@@ -1,12 +0,0 @@
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
- }
@@ -1,134 +0,0 @@
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();