foliko 1.0.80 → 1.0.82

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