foliko 1.0.83 → 1.0.85

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 (168) 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 +355 -6
  39. package/.agent/data/plugins-state.json +185 -146
  40. package/.agent/data/puppeteer-sessions/undefined.json +6 -0
  41. package/.agent/mcp_config.json +0 -1
  42. package/.agent/mcp_config_updated.json +12 -0
  43. package/.agent/plugins/puppeteer-plugin/README.md +147 -0
  44. package/.agent/plugins/puppeteer-plugin/index.js +1418 -0
  45. package/.agent/plugins/puppeteer-plugin/package.json +9 -0
  46. package/.agent/plugins.json +5 -14
  47. package/.agent/rules/GEMINI.md +273 -0
  48. package/.agent/rules/allow-rule.md +77 -0
  49. package/.agent/rules/log-rule.md +83 -0
  50. package/.agent/rules/security-rule.md +93 -0
  51. package/.agent/scripts/auto_preview.py +148 -0
  52. package/.agent/scripts/checklist.py +217 -0
  53. package/.agent/scripts/session_manager.py +120 -0
  54. package/.agent/scripts/verify_all.py +327 -0
  55. package/.agent/skills/api-patterns/SKILL.md +81 -0
  56. package/.agent/skills/api-patterns/api-style.md +42 -0
  57. package/.agent/skills/api-patterns/auth.md +24 -0
  58. package/.agent/skills/api-patterns/documentation.md +26 -0
  59. package/.agent/skills/api-patterns/graphql.md +41 -0
  60. package/.agent/skills/api-patterns/rate-limiting.md +31 -0
  61. package/.agent/skills/api-patterns/response.md +37 -0
  62. package/.agent/skills/api-patterns/rest.md +40 -0
  63. package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  64. package/.agent/skills/api-patterns/security-testing.md +122 -0
  65. package/.agent/skills/api-patterns/trpc.md +41 -0
  66. package/.agent/skills/api-patterns/versioning.md +22 -0
  67. package/.agent/skills/app-builder/SKILL.md +75 -0
  68. package/.agent/skills/app-builder/agent-coordination.md +71 -0
  69. package/.agent/skills/app-builder/feature-building.md +53 -0
  70. package/.agent/skills/app-builder/project-detection.md +34 -0
  71. package/.agent/skills/app-builder/scaffolding.md +118 -0
  72. package/.agent/skills/app-builder/tech-stack.md +40 -0
  73. package/.agent/skills/app-builder/templates/SKILL.md +39 -0
  74. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  75. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  76. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  77. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  78. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  79. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  80. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  81. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
  82. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
  83. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
  84. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
  85. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  86. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
  87. package/.agent/skills/architecture/SKILL.md +55 -0
  88. package/.agent/skills/architecture/context-discovery.md +43 -0
  89. package/.agent/skills/architecture/examples.md +94 -0
  90. package/.agent/skills/architecture/pattern-selection.md +68 -0
  91. package/.agent/skills/architecture/patterns-reference.md +50 -0
  92. package/.agent/skills/architecture/trade-off-analysis.md +77 -0
  93. package/.agent/skills/clean-code/SKILL.md +201 -0
  94. package/.agent/skills/doc.md +177 -0
  95. package/.agent/skills/frontend-design/SKILL.md +418 -0
  96. package/.agent/skills/frontend-design/animation-guide.md +331 -0
  97. package/.agent/skills/frontend-design/color-system.md +311 -0
  98. package/.agent/skills/frontend-design/decision-trees.md +418 -0
  99. package/.agent/skills/frontend-design/motion-graphics.md +306 -0
  100. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  101. package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
  102. package/.agent/skills/frontend-design/typography-system.md +345 -0
  103. package/.agent/skills/frontend-design/ux-psychology.md +1116 -0
  104. package/.agent/skills/frontend-design/visual-effects.md +383 -0
  105. package/.agent/skills/i18n-localization/SKILL.md +154 -0
  106. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  107. package/.agent/skills/mcp-builder/SKILL.md +176 -0
  108. package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
  109. package/.agent/workflows/brainstorm.md +113 -0
  110. package/.agent/workflows/create.md +59 -0
  111. package/.agent/workflows/debug.md +103 -0
  112. package/.agent/workflows/deploy.md +176 -0
  113. package/.agent/workflows/enhance.md +63 -0
  114. package/.agent/workflows/orchestrate.md +237 -0
  115. package/.agent/workflows/plan.md +89 -0
  116. package/.agent/workflows/preview.md +81 -0
  117. package/.agent/workflows/simple-test.md +42 -0
  118. package/.agent/workflows/status.md +86 -0
  119. package/.agent/workflows/structured-orchestrate.md +180 -0
  120. package/.agent/workflows/test.md +144 -0
  121. package/.agent/workflows/ui-ux-pro-max.md +296 -0
  122. package/.claude/settings.local.json +178 -171
  123. package/.env.example +56 -56
  124. package/cli/src/commands/plugin.js +482 -0
  125. package/cli/src/index.js +7 -0
  126. package/cli/src/utils/plugin-config.js +50 -0
  127. package/package.json +1 -1
  128. package/plugins/audit-plugin.js +2 -0
  129. package/plugins/extension-executor-plugin.js +38 -0
  130. package/plugins/plugin-manager-plugin.js +402 -0
  131. package/plugins/session-plugin.js +3 -3
  132. package/skills/find-skills/AGENTS.md +162 -162
  133. package/skills/find-skills/SKILL.md +133 -133
  134. package/skills/foliko-dev/SKILL.md +563 -563
  135. package/skills/plugin-guide/SKILL.md +139 -0
  136. package/skills/python-plugin-dev/SKILL.md +238 -238
  137. package/src/core/agent-chat.js +103 -45
  138. package/src/core/framework.js +42 -1
  139. package/src/executors/mcp-executor.js +33 -0
  140. package/src/utils/index.js +153 -0
  141. package/xhs_auth.json +268 -0
  142. package/.agent/agents/code-assistant.json +0 -14
  143. package/.agent/agents/email-assistant.json +0 -14
  144. package/.agent/agents/file-assistant.json +0 -15
  145. package/.agent/agents/system-assistant.json +0 -15
  146. package/.agent/agents/web-assistant.json +0 -12
  147. package/.agent/data/ambient/goals.json +0 -50
  148. package/.agent/data/ambient/memories.json +0 -7
  149. package/.agent/data/scheduler/tasks.json +0 -1
  150. package/.agent/package.json +0 -8
  151. package/.agent/plugins/__pycache__/test_plugin.cpython-312.pyc +0 -0
  152. package/.agent/plugins/system-info/index.js +0 -387
  153. package/.agent/plugins/system-info/package.json +0 -4
  154. package/.agent/plugins/system-info/test.js +0 -40
  155. package/.agent/plugins/test_plugin.py +0 -304
  156. package/.agent/python-scripts/test_sample.py +0 -24
  157. package/.agent/skills/sysinfo/SKILL.md +0 -38
  158. package/.agent/skills/sysinfo/system-info.sh +0 -130
  159. package/.agent/skills/workflow/SKILL.md +0 -324
  160. package/.agent/workflows/email-digest.json +0 -50
  161. package/.agent/workflows/file-backup.json +0 -21
  162. package/.agent/workflows/get-ip-notify.json +0 -32
  163. package/.agent/workflows/news-aggregator.json +0 -93
  164. package/.agent/workflows/news-dashboard-v2.json +0 -94
  165. package/.agent/workflows/notification-batch.json +0 -32
  166. package/reports/system-health-report-20260401.md +0 -79
  167. package/test/tool-registry-validation.test.js +0 -218
  168. package/test_report.md +0 -70
@@ -1,304 +0,0 @@
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,24 +0,0 @@
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()
@@ -1,38 +0,0 @@
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**: 主机名、操作系统、内核版本
@@ -1,130 +0,0 @@
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 "=========================================="