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
@@ -0,0 +1,304 @@
1
+ # .agent/plugins/test_plugin.py
2
+ """
3
+ Python 测试插件 - 提供单元测试和覆盖率测试功能
4
+ """
5
+
6
+ PLUGIN = {
7
+ "name": "test_plugin",
8
+ "version": "1.0.0",
9
+ "description": "Python 单元测试和覆盖率测试插件"
10
+ }
11
+
12
+ TOOLS = [
13
+ {
14
+ "name": "run_tests",
15
+ "description": "运行 Python 测试文件或目录中的测试用例",
16
+ "params": {
17
+ "path": "string",
18
+ "verbose": "boolean",
19
+ "pattern": "string"
20
+ }
21
+ },
22
+ {
23
+ "name": "create_test",
24
+ "description": "创建单元测试文件模板",
25
+ "params": {
26
+ "path": "string",
27
+ "class_name": "string",
28
+ "test_methods": "array",
29
+ "module_name": "string"
30
+ }
31
+ },
32
+ {
33
+ "name": "run_coverage",
34
+ "description": "运行测试并生成覆盖率报告",
35
+ "params": {
36
+ "path": "string",
37
+ "source": "string",
38
+ "report_type": "string"
39
+ }
40
+ },
41
+ {
42
+ "name": "assert_equal",
43
+ "description": "断言两个值相等(测试辅助)",
44
+ "params": {
45
+ "actual": "any",
46
+ "expected": "any",
47
+ "message": "string"
48
+ }
49
+ },
50
+ {
51
+ "name": "mock_function",
52
+ "description": "创建模拟函数用于测试",
53
+ "params": {
54
+ "return_value": "any",
55
+ "side_effect": "array",
56
+ "called_count": "number"
57
+ }
58
+ }
59
+ ]
60
+
61
+ # === 工具实现 ===
62
+
63
+ import os
64
+ import json
65
+ import subprocess
66
+ import traceback
67
+ from datetime import datetime
68
+
69
+
70
+ def run_tests(params):
71
+ """运行 Python 测试文件或目录中的测试用例"""
72
+ path = params.get("path", ".")
73
+ verbose = params.get("verbose", True)
74
+ pattern = params.get("pattern", "test_*.py")
75
+
76
+ if not os.path.exists(path):
77
+ return {"success": False, "error": f"Path not found: {path}"}
78
+
79
+ # 构建 pytest 命令
80
+ cmd = ["pytest", path]
81
+ if verbose:
82
+ cmd.append("-v")
83
+
84
+ try:
85
+ result = subprocess.run(
86
+ cmd,
87
+ capture_output=True,
88
+ text=True,
89
+ timeout=60
90
+ )
91
+
92
+ output = result.stdout + result.stderr
93
+
94
+ return {
95
+ "success": result.returncode == 0,
96
+ "result": {
97
+ "passed": result.returncode == 0,
98
+ "output": output,
99
+ "return_code": result.returncode
100
+ }
101
+ }
102
+ except subprocess.TimeoutExpired:
103
+ return {"success": False, "error": "Test execution timed out"}
104
+ except Exception as e:
105
+ return {"success": False, "error": str(e)}
106
+
107
+
108
+ def create_test(params):
109
+ """创建单元测试文件模板"""
110
+ path = params.get("path")
111
+ class_name = params.get("class_name", "TestModule")
112
+ test_methods = params.get("test_methods", ["test_case"])
113
+ module_name = params.get("module_name", "")
114
+
115
+ if not path:
116
+ return {"success": False, "error": "path is required"}
117
+
118
+ # 确保目录存在
119
+ os.makedirs(os.path.dirname(path) if os.path.dirname(path) else ".", exist_ok=True)
120
+
121
+ # 生成测试模板
122
+ template = f'''"""
123
+ 测试模块 - {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
124
+ """
125
+
126
+ import unittest
127
+ {"import " + module_name if module_name else ""}
128
+
129
+
130
+ class {class_name}(unittest.TestCase):
131
+ """{class_name} 测试类"""
132
+ '''
133
+
134
+ for method in test_methods:
135
+ template += f'''
136
+ def {method}(self):
137
+ """测试用例: {method}"""
138
+ # TODO: 实现测试逻辑
139
+ self.assertTrue(True)
140
+ '''
141
+
142
+ template += '''
143
+
144
+ if __name__ == "__main__":
145
+ unittest.main()
146
+ '''
147
+
148
+ try:
149
+ with open(path, "w", encoding="utf-8") as f:
150
+ f.write(template)
151
+
152
+ return {
153
+ "success": True,
154
+ "result": {
155
+ "path": path,
156
+ "class_name": class_name,
157
+ "methods": test_methods
158
+ }
159
+ }
160
+ except Exception as e:
161
+ return {"success": False, "error": str(e)}
162
+
163
+
164
+ def run_coverage(params):
165
+ """运行测试并生成覆盖率报告"""
166
+ path = params.get("path", ".")
167
+ source = params.get("source", "")
168
+ report_type = params.get("report_type", "term")
169
+
170
+ if not os.path.exists(path):
171
+ return {"success": False, "error": f"Path not found: {path}"}
172
+
173
+ # 构建 coverage 命令
174
+ cmd = ["coverage", "run", "-m", "pytest", path]
175
+ if source:
176
+ cmd = ["coverage", "run", "--source", source, "-m", "pytest", path]
177
+
178
+ try:
179
+ # 运行测试
180
+ subprocess.run(cmd, capture_output=True, timeout=60)
181
+
182
+ # 生成报告
183
+ if report_type == "term":
184
+ report_result = subprocess.run(
185
+ ["coverage", "report"],
186
+ capture_output=True,
187
+ text=True
188
+ )
189
+ output = report_result.stdout
190
+ elif report_type == "html":
191
+ subprocess.run(
192
+ ["coverage", "html", "-d", "htmlcov"],
193
+ capture_output=True,
194
+ timeout=30
195
+ )
196
+ output = "Coverage HTML report generated at htmlcov/"
197
+ elif report_type == "json":
198
+ report_result = subprocess.run(
199
+ ["coverage", "json"],
200
+ capture_output=True,
201
+ text=True
202
+ )
203
+ output = report_result.stdout
204
+ else:
205
+ output = "Unknown report type"
206
+
207
+ return {
208
+ "success": True,
209
+ "result": {
210
+ "report": output,
211
+ "type": report_type
212
+ }
213
+ }
214
+ except subprocess.TimeoutExpired:
215
+ return {"success": False, "error": "Coverage execution timed out"}
216
+ except FileNotFoundError:
217
+ return {"success": False, "error": "coverage module not installed. Run: pip install coverage"}
218
+ except Exception as e:
219
+ return {"success": False, "error": str(e)}
220
+
221
+
222
+ def assert_equal(params):
223
+ """断言两个值相等(测试辅助)"""
224
+ actual = params.get("actual")
225
+ expected = params.get("expected")
226
+ message = params.get("message", "")
227
+
228
+ try:
229
+ # 处理 JSON 字符串比较
230
+ if isinstance(actual, str):
231
+ try:
232
+ actual = json.loads(actual)
233
+ except (json.JSONDecodeError, TypeError):
234
+ pass
235
+
236
+ if isinstance(expected, str):
237
+ try:
238
+ expected = json.loads(expected)
239
+ except (json.JSONDecodeError, TypeError):
240
+ pass
241
+
242
+ if actual == expected:
243
+ return {
244
+ "success": True,
245
+ "result": {
246
+ "passed": True,
247
+ "message": f"Assertion passed: {actual} == {expected}",
248
+ "actual": actual,
249
+ "expected": expected
250
+ }
251
+ }
252
+ else:
253
+ return {
254
+ "success": True,
255
+ "result": {
256
+ "passed": False,
257
+ "message": f"Assertion failed: {actual} != {expected}",
258
+ "actual": actual,
259
+ "expected": expected
260
+ }
261
+ }
262
+ except Exception as e:
263
+ return {"success": False, "error": str(e)}
264
+
265
+
266
+ def mock_function(params):
267
+ """创建模拟函数用于测试"""
268
+ return_value = params.get("return_value")
269
+ side_effect = params.get("side_effect", [])
270
+ called_count = params.get("called_count", 0)
271
+
272
+ class MockResult:
273
+ def __init__(self):
274
+ self.call_count = 0
275
+ self.call_args = []
276
+ self.side_effects = side_effect
277
+
278
+ def __call__(self, *args, **kwargs):
279
+ self.call_count += 1
280
+ self.call_args.append({"args": args, "kwargs": kwargs})
281
+
282
+ # 如果有 side_effect,按顺序返回
283
+ if self.side_effects:
284
+ index = min(self.call_count - 1, len(self.side_effects) - 1)
285
+ return self.side_effects[index]
286
+
287
+ return return_value
288
+
289
+ def reset(self):
290
+ self.call_count = 0
291
+ self.call_args = []
292
+
293
+ mock = MockResult()
294
+ mock.call_count = called_count
295
+
296
+ return {
297
+ "success": True,
298
+ "result": {
299
+ "mock_type": "MockFunction",
300
+ "return_value": return_value,
301
+ "side_effects": side_effect,
302
+ "description": "Use this mock function in your tests"
303
+ }
304
+ }
@@ -1,5 +1,14 @@
1
- {
2
- "weixin": {
3
- "enabled": true
4
- }
5
- }
1
+ {
2
+ "email": {
3
+ "enabled": true,
4
+ "smtp": {
5
+ "host": "smtp.gmail.com",
6
+ "port": 587,
7
+ "secure": false
8
+ },
9
+ "imap": {
10
+ "host": "imap.gmail.com",
11
+ "port": 993
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,24 @@
1
+ """
2
+ 测试模块 - 2026-04-02 02:52:12
3
+ """
4
+
5
+ import unittest
6
+
7
+
8
+
9
+ class TestMath(unittest.TestCase):
10
+ """TestMath 测试类"""
11
+
12
+ def test_add(self):
13
+ """测试用例: test_add"""
14
+ # TODO: 实现测试逻辑
15
+ self.assertTrue(True)
16
+
17
+ def test_subtract(self):
18
+ """测试用例: test_subtract"""
19
+ # TODO: 实现测试逻辑
20
+ self.assertTrue(True)
21
+
22
+
23
+ if __name__ == "__main__":
24
+ unittest.main()
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: sysinfo
3
+ description: 使用 Bash 脚本查询系统信息(CPU、内存、磁盘、网络)
4
+ allowed-tools:
5
+ - get_cpu_info
6
+ - get_memory_info
7
+ - get_disk_info
8
+ - get_network_info
9
+ - get_full_system_info
10
+ ---
11
+
12
+ # 系统信息查询 (sysinfo)
13
+
14
+ 使用 Bash 脚本查询系统信息,支持模块化查询。
15
+
16
+ ## 使用方法
17
+
18
+ ### 完整系统信息
19
+ ```bash
20
+ bash .agent/skills/sysinfo/system-info.sh
21
+ ```
22
+
23
+ ### 分模块查询
24
+ ```bash
25
+ bash .agent/skills/sysinfo/system-info.sh cpu # CPU 信息
26
+ bash .agent/skills/sysinfo/system-info.sh memory # 内存信息
27
+ bash .agent/skills/sysinfo/system-info.sh disk # 磁盘信息
28
+ bash .agent/skills/sysinfo/system-info.sh network # 网络信息
29
+ bash .agent/skills/sysinfo/system-info.sh system # 系统基本信息
30
+ ```
31
+
32
+ ## 输出示例
33
+
34
+ - **CPU**: 型号、核心数、使用率
35
+ - **Memory**: 总内存、已用、可用、使用率
36
+ - **Disk**: 各分区容量和使用情况
37
+ - **Network**: IP 地址、网卡信息
38
+ - **System**: 主机名、操作系统、内核版本
@@ -0,0 +1,130 @@
1
+ #!/bin/bash
2
+ # 系统信息查询脚本(跨平台支持)
3
+ # 用法: system-info [option]
4
+ # 选项: all (默认), cpu, memory, disk, network, system
5
+
6
+ OPTION=${1:-all}
7
+
8
+ echo "=========================================="
9
+ echo " System Info Report - $(date '+%Y-%m-%d %H:%M:%S')"
10
+ echo "=========================================="
11
+ echo ""
12
+
13
+ # 系统基本信息
14
+ show_system() {
15
+ echo "[System Info]"
16
+ echo " Hostname: $(hostname)"
17
+ echo " OS: $(uname -s)"
18
+ echo " Kernel: $(uname -r)"
19
+ echo " Arch: $(uname -m)"
20
+ echo ""
21
+ }
22
+
23
+ # CPU 信息
24
+ show_cpu() {
25
+ echo "[CPU Info]"
26
+ if [ -f /proc/cpuinfo ]; then
27
+ echo " Model: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d':' -f2 | xargs)"
28
+ echo " Cores: $(grep -c ^processor /proc/cpuinfo)"
29
+ elif command -v powershell &> /dev/null; then
30
+ cpu_info=$(powershell -NoProfile -Command "
31
+ \$cpu = Get-CimInstance Win32_Processor | Select-Object -First 1
32
+ \$cores = (Get-CimInstance Win32_Processor | Measure-Object -Property NumberOfCores -Sum).Sum
33
+ \$threads = (Get-CimInstance Win32_Processor | Measure-Object -Property NumberOfLogicalProcessors -Sum).Sum
34
+ Write-Output \"\$(\$cpu.Name)|\$cores|\$threads\"
35
+ ")
36
+ cpu_name=$(echo "$cpu_info" | cut -d'|' -f1)
37
+ cpu_cores=$(echo "$cpu_info" | cut -d'|' -f2)
38
+ cpu_threads=$(echo "$cpu_info" | cut -d'|' -f3)
39
+ echo " Model: $cpu_name"
40
+ echo " Cores: $cpu_cores"
41
+ echo " Threads: $cpu_threads"
42
+ else
43
+ echo " Model: $(sysctl -n machdep.cpu.brand_string 2>/dev/null || echo 'Unknown')"
44
+ fi
45
+ echo ""
46
+ }
47
+
48
+ # 内存信息
49
+ show_memory() {
50
+ echo "[Memory Info]"
51
+ if [ -f /proc/meminfo ]; then
52
+ mem_total=$(grep MemTotal /proc/meminfo | awk '{printf "%.2f GB", $2/1024/1024}')
53
+ mem_free=$(grep MemFree /proc/meminfo | awk '{printf "%.2f GB", $2/1024/1024}')
54
+ mem_avail=$(grep MemAvailable /proc/meminfo 2>/dev/null | awk '{printf "%.2f GB", $2/1024/1024}')
55
+ echo " Total: $mem_total"
56
+ echo " Free: $mem_free"
57
+ echo " Available: ${mem_avail:-N/A}"
58
+ elif command -v powershell &> /dev/null; then
59
+ mem_info=$(powershell -NoProfile -Command "
60
+ \$os = Get-CimInstance Win32_OperatingSystem
61
+ \$total = [math]::Round(\$os.TotalVisibleMemorySize / 1MB, 2)
62
+ \$free = [math]::Round(\$os.FreePhysicalMemory / 1MB, 2)
63
+ \$used = [math]::Round(\$total - \$free, 2)
64
+ \$pct = [math]::Round((\$used / \$total) * 100, 1)
65
+ Write-Output \"\$total|\$used|\$free|\$pct\"
66
+ ")
67
+ total=$(echo "$mem_info" | cut -d'|' -f1)
68
+ used=$(echo "$mem_info" | cut -d'|' -f2)
69
+ free=$(echo "$mem_info" | cut -d'|' -f3)
70
+ pct=$(echo "$mem_info" | cut -d'|' -f4)
71
+ echo " Total: ${total} GB"
72
+ echo " Used: ${used} GB (${pct}%)"
73
+ echo " Free: ${free} GB"
74
+ else
75
+ echo " Unable to get memory info"
76
+ fi
77
+ echo ""
78
+ }
79
+
80
+ # 磁盘信息
81
+ show_disk() {
82
+ echo "[Disk Info]"
83
+ if command -v powershell &> /dev/null; then
84
+ # Windows PowerShell - 使用 UTF8 编码输出
85
+ powershell -NoProfile -Command "[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; Get-CimInstance Win32_LogicalDisk -Filter \"DriveType=3\" | Format-Table -AutoSize | Out-String"
86
+ elif [ -f /proc/mounts ] && command -v df &> /dev/null; then
87
+ df -h | grep -E '^/dev/' | awk '{
88
+ printf " %s: Total %s, Used %s (%s), Free %s\n", $1, $2, $3, $5, $4
89
+ }'
90
+ else
91
+ echo " Unable to get disk info"
92
+ fi
93
+ echo ""
94
+ }
95
+
96
+ # 网络信息
97
+ show_network() {
98
+ echo "[Network Info]"
99
+ echo " IP Addresses:"
100
+ if command -v ip &> /dev/null; then
101
+ ip addr show | grep inet | grep -v '127.0.0.1' | awk '{printf " %s\n", $2}'
102
+ elif command -v ifconfig &> /dev/null; then
103
+ ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{printf " %s\n", $2}'
104
+ elif command -v powershell &> /dev/null; then
105
+ powershell -NoProfile -Command "Get-NetIPAddress -AddressFamily IPv4 | Where-Object { \$_.IPAddress -ne '127.0.0.1' } | ForEach-Object { Write-Output \" \$(\$_.IPAddress)\" }"
106
+ fi
107
+ echo ""
108
+ }
109
+
110
+ # 执行选项
111
+ case $OPTION in
112
+ all)
113
+ show_system
114
+ show_cpu
115
+ show_memory
116
+ show_disk
117
+ show_network
118
+ ;;
119
+ cpu) show_cpu ;;
120
+ memory) show_memory ;;
121
+ disk) show_disk ;;
122
+ network) show_network ;;
123
+ system) show_system ;;
124
+ *)
125
+ echo "Usage: system-info [all|cpu|memory|disk|network|system]"
126
+ exit 1
127
+ ;;
128
+ esac
129
+
130
+ echo "=========================================="