ErisPulse 2.4.5.dev1__tar.gz → 2.4.5.dev3__tar.gz

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 (124) hide show
  1. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/PKG-INFO +9 -1
  2. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/README.md +8 -0
  3. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/pyproject.toml +1 -1
  4. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/cli.py +4 -1
  5. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/cli.pyi +1 -1
  6. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/init.py +118 -12
  7. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/install.py +2 -10
  8. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/install.pyi +0 -1
  9. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/run.py +4 -0
  10. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/self_update.py +1 -6
  11. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/self_update.pyi +0 -1
  12. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/uninstall.py +1 -9
  13. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/uninstall.pyi +0 -1
  14. erispulse-2.4.5.dev3/src/ErisPulse/CLI/console.py +84 -0
  15. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/console.pyi +3 -0
  16. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/registry.py +1 -1
  17. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/wrapper.py +212 -3
  18. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/wrapper.pyi +113 -2
  19. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/__init__.py +12 -3
  20. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/__init__.pyi +4 -3
  21. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/adapter.py +23 -38
  22. erispulse-2.4.5.dev3/src/ErisPulse/Core/config.py +630 -0
  23. erispulse-2.4.5.dev3/src/ErisPulse/Core/config.pyi +175 -0
  24. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/logger.py +7 -10
  25. erispulse-2.4.5.dev3/src/ErisPulse/Core/metrics.py +489 -0
  26. erispulse-2.4.5.dev3/src/ErisPulse/Core/metrics.pyi +302 -0
  27. erispulse-2.4.5.dev3/src/ErisPulse/Core/router.py +1234 -0
  28. erispulse-2.4.5.dev3/src/ErisPulse/Core/router.pyi +451 -0
  29. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/storage.py +1 -1
  30. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/__init__.py +1 -0
  31. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/__init__.pyi +1 -1
  32. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/module.py +115 -13
  33. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/module.pyi +1 -3
  34. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/runtime/frame_config.py +5 -3
  35. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/sdk.py +55 -22
  36. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/sdk.pyi +4 -0
  37. erispulse-2.4.5.dev1/src/ErisPulse/CLI/console.py +0 -47
  38. erispulse-2.4.5.dev1/src/ErisPulse/Core/config.py +0 -333
  39. erispulse-2.4.5.dev1/src/ErisPulse/Core/config.pyi +0 -80
  40. erispulse-2.4.5.dev1/src/ErisPulse/Core/router.py +0 -571
  41. erispulse-2.4.5.dev1/src/ErisPulse/Core/router.pyi +0 -174
  42. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/.gitignore +0 -0
  43. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/LICENSE +0 -0
  44. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/__init__.py +0 -0
  45. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/__init__.pyi +0 -0
  46. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/base.py +0 -0
  47. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/base.pyi +0 -0
  48. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/__init__.py +0 -0
  49. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
  50. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/init.pyi +0 -0
  51. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/list.py +0 -0
  52. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/list.pyi +0 -0
  53. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/list_remote.py +0 -0
  54. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/list_remote.pyi +0 -0
  55. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/run.pyi +0 -0
  56. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/upgrade.py +0 -0
  57. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/commands/upgrade.pyi +0 -0
  58. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/registry.pyi +0 -0
  59. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/utils/__init__.py +0 -0
  60. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
  61. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/utils/package_manager.py +0 -0
  62. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/CLI/utils/package_manager.pyi +0 -0
  63. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/__init__.py +0 -0
  64. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/__init__.pyi +0 -0
  65. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/adapter.py +0 -0
  66. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/adapter.pyi +0 -0
  67. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/manager.py +0 -0
  68. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
  69. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/module.py +0 -0
  70. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/module.pyi +0 -0
  71. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/storage.py +0 -0
  72. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Bases/storage.pyi +0 -0
  73. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/__init__.py +0 -0
  74. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/__init__.pyi +0 -0
  75. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/base.py +0 -0
  76. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/base.pyi +0 -0
  77. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/command.py +0 -0
  78. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/command.pyi +0 -0
  79. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/message.py +0 -0
  80. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/message.pyi +0 -0
  81. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/message_builder.py +0 -0
  82. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
  83. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/meta.py +0 -0
  84. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/meta.pyi +0 -0
  85. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/notice.py +0 -0
  86. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/notice.pyi +0 -0
  87. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/request.py +0 -0
  88. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/request.pyi +0 -0
  89. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/session_type.py +0 -0
  90. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
  91. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/adapter.pyi +0 -0
  92. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/lifecycle.py +0 -0
  93. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/lifecycle.pyi +0 -0
  94. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/logger.pyi +0 -0
  95. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/module.py +0 -0
  96. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/module.pyi +0 -0
  97. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/Core/storage.pyi +0 -0
  98. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/__main__.py +0 -0
  99. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/__main__.pyi +0 -0
  100. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/__init__.py +0 -0
  101. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/__init__.pyi +0 -0
  102. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/adapter.py +0 -0
  103. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/adapter.pyi +0 -0
  104. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/bases/__init__.py +0 -0
  105. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
  106. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/bases/finder.py +0 -0
  107. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/bases/finder.pyi +0 -0
  108. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/module.py +0 -0
  109. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/finders/module.pyi +0 -0
  110. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/__init__.py +0 -0
  111. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/__init__.pyi +0 -0
  112. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/adapter.py +0 -0
  113. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/adapter.pyi +0 -0
  114. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/bases/__init__.py +0 -0
  115. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
  116. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/bases/loader.py +0 -0
  117. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
  118. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/strategy.py +0 -0
  119. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/loaders/strategy.pyi +0 -0
  120. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/runtime/__init__.py +0 -0
  121. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/runtime/__init__.pyi +0 -0
  122. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/runtime/exceptions.py +0 -0
  123. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/runtime/exceptions.pyi +0 -0
  124. {erispulse-2.4.5.dev1 → erispulse-2.4.5.dev3}/src/ErisPulse/runtime/frame_config.pyi +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ErisPulse
3
- Version: 2.4.5.dev1
3
+ Version: 2.4.5.dev3
4
4
  Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
5
5
  Author-email: ErisDev <erisdev@88.com>
6
6
  Maintainer-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
@@ -214,6 +214,14 @@ docker pull erispulse/erispulse:dev
214
214
 
215
215
  </details>
216
216
 
217
+ ### 1Panel 应用商店
218
+
219
+ 通过 [1Panel](https://1panel.cn) 应用商店一键安装 ErisPulse,详见 [ErisPulse-1Panel](https://github.com/ErisPulse/ErisPulse-1Panel)。
220
+
221
+ ```bash
222
+ bash <(curl -sL https://get-1panel.erisdev.com/install.sh)
223
+ ```
224
+
217
225
  ### 使用 pip 安装
218
226
 
219
227
  ```bash
@@ -142,6 +142,14 @@ docker pull erispulse/erispulse:dev
142
142
 
143
143
  </details>
144
144
 
145
+ ### 1Panel 应用商店
146
+
147
+ 通过 [1Panel](https://1panel.cn) 应用商店一键安装 ErisPulse,详见 [ErisPulse-1Panel](https://github.com/ErisPulse/ErisPulse-1Panel)。
148
+
149
+ ```bash
150
+ bash <(curl -sL https://get-1panel.erisdev.com/install.sh)
151
+ ```
152
+
145
153
  ### 使用 pip 安装
146
154
 
147
155
  ```bash
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ErisPulse"
7
- version = "2.4.5-dev.1"
7
+ version = "2.4.5-dev.3"
8
8
  description = "ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -12,7 +12,7 @@ from argparse import ArgumentParser, RawDescriptionHelpFormatter
12
12
 
13
13
  from rich.panel import Panel
14
14
 
15
- from .console import console
15
+ from .console import console, print_banner
16
16
  from .registry import CommandRegistry
17
17
  from .base import Command
18
18
 
@@ -143,6 +143,8 @@ class CLI:
143
143
  args, unknown = self.parser.parse_known_args()
144
144
  args._unknown_args = unknown
145
145
 
146
+ print_banner()
147
+
146
148
  # 处理版本选项
147
149
  if args.version:
148
150
  self._print_version()
@@ -162,6 +164,7 @@ class CLI:
162
164
  # 执行命令
163
165
  command = self.registry.get(args.command)
164
166
  if command:
167
+ console.print(f"[title]{command.description}[/]")
165
168
  command.execute(args)
166
169
  else:
167
170
  console.print(f"[error]未知命令: {args.command}[/]")
@@ -16,7 +16,7 @@ import traceback
16
16
  import pkgutil
17
17
  from argparse import ArgumentParser, RawDescriptionHelpFormatter
18
18
  from rich.panel import Panel
19
- from .console import console
19
+ from .console import console, print_banner
20
20
  from .registry import CommandRegistry
21
21
  from .base import Command
22
22
 
@@ -84,32 +84,32 @@ class InitCommand(Command):
84
84
  dir_path.mkdir(exist_ok=True)
85
85
  console.print(f"[green]创建目录: {dir_name}[/green]")
86
86
 
87
- # 创建配置文件
87
+ # 创建配置文件 (最小必须配置)
88
88
  config_file = project_path / "config" / "config.toml"
89
89
  if not config_file.exists():
90
90
  with open(config_file, "w", encoding="utf-8") as f:
91
- f.write("# ErisPulse 配置文件\n\n")
92
- f.write("[ErisPulse]\n")
93
- f.write("# 全局配置\n\n")
91
+ f.write("# ErisPulse 配置文件\n")
92
+ f.write("# 完整配置示例请参考 config.full.example\n\n")
94
93
  f.write("[ErisPulse.server]\n")
95
94
  f.write('host = "0.0.0.0"\n')
96
95
  f.write("port = 8000\n\n")
97
96
  f.write("[ErisPulse.logger]\n")
98
97
  f.write('level = "INFO"\n')
99
- f.write("log_files = [\"logs/app.log\"]\n")
100
- f.write("memory_limit = 1000\n\n")
101
98
 
102
- # 添加适配器配置
103
99
  if adapter_list:
104
- f.write("[ErisPulse.adapters]\n")
105
- f.write("# 适配器配置\n\n")
106
- f.write("[ErisPulse.adapters.status]\n")
100
+ f.write("\n[ErisPulse.adapters.status]\n")
107
101
  for adapter in adapter_list:
108
- f.write(f'{adapter} = false # 默认禁用,需要时启用\n')
109
- f.write("\n")
102
+ f.write(f'{adapter} = false\n')
110
103
 
111
104
  console.print("[green]创建配置文件: config/config.toml[/green]")
112
105
 
106
+ # 创建完整配置示例文件
107
+ example_file = project_path / "config" / "config.full.example"
108
+ if not example_file.exists():
109
+ with open(example_file, "w", encoding="utf-8") as f:
110
+ f.write(self._get_full_example_config(adapter_list))
111
+ console.print("[green]创建配置示例: config/config.full.example[/green]")
112
+
113
113
  # 创建主程序文件
114
114
  main_file = project_path / "main.py"
115
115
  if not main_file.exists():
@@ -139,6 +139,112 @@ class InitCommand(Command):
139
139
  console.print(f"[red]初始化项目失败: {e}[/]")
140
140
  return False
141
141
 
142
+ @staticmethod
143
+ def _get_full_example_config(adapter_list=None):
144
+ """
145
+ 生成完整配置示例文件内容
146
+
147
+ :param adapter_list: list 可用适配器列表
148
+ :return: str 完整配置示例内容
149
+
150
+ {!--< internal-use >!--}
151
+ {!--< /internal-use >!--}
152
+ """
153
+ lines = [
154
+ "# ErisPulse 完整配置示例",
155
+ "# 此文件展示所有可用配置项及其默认值",
156
+ "# 如需使用,将所需配置复制到 config.toml 并按需修改",
157
+ "",
158
+ "# ==================== 服务器 ====================",
159
+ "",
160
+ "[ErisPulse.server]",
161
+ 'host = "0.0.0.0" # 监听地址',
162
+ "port = 8000 # 监听端口",
163
+ "ssl_certfile = null # SSL 证书路径",
164
+ "ssl_keyfile = null # SSL 密钥路径",
165
+ "",
166
+ "# ==================== 日志 ====================",
167
+ "",
168
+ "[ErisPulse.logger]",
169
+ 'level = "INFO" # 日志级别: DEBUG/INFO/WARNING/ERROR',
170
+ "log_files = [] # 日志文件列表, 如 [\"logs/app.log\"]",
171
+ "memory_limit = 1000 # 内存日志条数上限",
172
+ "",
173
+ "# ==================== 存储 ====================",
174
+ "",
175
+ "[ErisPulse.storage]",
176
+ "use_global_db = false # 是否使用全局数据库",
177
+ "",
178
+ "# ==================== 事件系统 ====================",
179
+ "",
180
+ "[ErisPulse.event.message]",
181
+ "ignore_self = true # 忽略自身消息",
182
+ "",
183
+ "[ErisPulse.event.command]",
184
+ 'prefix = "/" # 命令前缀',
185
+ "case_sensitive = true # 区分大小写",
186
+ "allow_space_prefix = false # 允许前缀前有空格",
187
+ "must_at_bot = false # 必须艾特Bot才触发",
188
+ "",
189
+ "# ==================== 框架 ====================",
190
+ "",
191
+ "[ErisPulse.framework]",
192
+ "enable_lazy_loading = true # 启用模块懒加载",
193
+ "",
194
+ "# ==================== 配置审计 ====================",
195
+ "",
196
+ "[ErisPulse.config.audit]",
197
+ "enabled = false # 是否启用配置审计",
198
+ "max_entries = 1000 # 审计日志最大条数",
199
+ "",
200
+ "# ==================== 指标监控 ====================",
201
+ "",
202
+ "[ErisPulse.metrics]",
203
+ "enabled = false # 是否启用指标采集",
204
+ "",
205
+ "# ==================== 路由增强 ====================",
206
+ "",
207
+ "[ErisPulse.router.cors]",
208
+ "enabled = false",
209
+ 'allow_origins = ["*"]',
210
+ 'allow_methods = ["*"]',
211
+ 'allow_headers = ["*"]',
212
+ "allow_credentials = false",
213
+ "max_age = 600",
214
+ "",
215
+ "[ErisPulse.router.security]",
216
+ "enabled = false",
217
+ "",
218
+ "[ErisPulse.router.security.headers]",
219
+ 'X-Content-Type-Options = "nosniff"',
220
+ 'X-Frame-Options = "DENY"',
221
+ "",
222
+ "# ==================== 适配器状态 ====================",
223
+ "",
224
+ "[ErisPulse.adapters.status]",
225
+ ]
226
+
227
+ if adapter_list:
228
+ for adapter in adapter_list:
229
+ lines.append(f"# {adapter} = false")
230
+ else:
231
+ lines.extend([
232
+ "# yunhu = false",
233
+ "# telegram = false",
234
+ "# onebot11 = false",
235
+ ])
236
+
237
+ lines.extend([
238
+ "",
239
+ "# ==================== 模块状态 ====================",
240
+ "",
241
+ "[ErisPulse.modules.status]",
242
+ "# MyModule = true",
243
+ "",
244
+ ])
245
+
246
+ return "\n".join(lines)
247
+
142
248
  async def _fetch_available_adapters(self):
143
249
  """
144
250
  从云端获取可用适配器列表
@@ -8,7 +8,6 @@ import sys
8
8
  import asyncio
9
9
  from argparse import ArgumentParser
10
10
 
11
- from rich.panel import Panel
12
11
  from rich.prompt import Confirm, Prompt
13
12
  from rich.table import Table
14
13
  from rich.box import SIMPLE
@@ -249,13 +248,6 @@ class InstallCommand(Command):
249
248
  self._interactive_install(args.upgrade, args.pre)
250
249
 
251
250
  def _interactive_install(self, upgrade: bool = False, pre: bool = False):
252
- console.print(Panel(
253
- "[bold cyan]ErisPulse 安装组件[/]\n"
254
- "选择您要安装的组件类型",
255
- title="欢迎",
256
- border_style="cyan"
257
- ))
258
-
259
251
  with console.status("[bold green]正在获取远程包列表...", spinner="dots"):
260
252
  remote_packages = asyncio.run(self.package_manager.get_remote_packages())
261
253
  console.print("[success]✔ 远程包列表获取完成[/]\n")
@@ -297,7 +289,7 @@ class InstallCommand(Command):
297
289
  return
298
290
 
299
291
  table = Table(box=SIMPLE, header_style="adapter", show_lines=False)
300
- table.add_column("序号", style="cyan", width=4)
292
+ table.add_column("序号", style="#A0B0C0", width=4)
301
293
  table.add_column("适配器名", style="adapter")
302
294
  table.add_column("包名")
303
295
  table.add_column("描述")
@@ -352,7 +344,7 @@ class InstallCommand(Command):
352
344
  return
353
345
 
354
346
  table = Table(box=SIMPLE, header_style="module", show_lines=False)
355
- table.add_column("序号", style="cyan", width=4)
347
+ table.add_column("序号", style="#A0B0C0", width=4)
356
348
  table.add_column("模块名", style="module")
357
349
  table.add_column("包名")
358
350
  table.add_column("描述")
@@ -13,7 +13,6 @@ Install 命令实现
13
13
  import sys
14
14
  import asyncio
15
15
  from argparse import ArgumentParser
16
- from rich.panel import Panel
17
16
  from rich.prompt import Confirm, Prompt
18
17
  from rich.table import Table
19
18
  from rich.box import SIMPLE
@@ -101,6 +101,10 @@ class RunCommand(Command):
101
101
  console.print(f"[error]脚本 [path]{script}[/] 不存在[/]")
102
102
  console.print("[info]使用 [cyan]epsdk init[/cyan] 创建新项目[/]")
103
103
  return
104
+ if os.path.isdir(script):
105
+ console.print(f"[error][path]{script}[/] 是一个目录,无法直接运行[/]")
106
+ console.print("[info]请指定具体的脚本文件,例如: [cyan]epsdk run {0}/main.py[/]".format(script))
107
+ return
104
108
  self._run_script(script, reload_mode)
105
109
  else:
106
110
  self._run_internal(reload_mode)
@@ -8,7 +8,6 @@ import sys
8
8
  import asyncio
9
9
  from argparse import ArgumentParser
10
10
  from rich.prompt import Confirm, Prompt
11
- from rich.panel import Panel
12
11
 
13
12
  from ..utils import PackageManager
14
13
  from ..console import console
@@ -41,11 +40,7 @@ class SelfUpdateCommand(Command):
41
40
 
42
41
  def execute(self, args):
43
42
  current_version = self.package_manager.get_installed_version()
44
- console.print(Panel(
45
- f"[title]ErisPulse SDK 自更新[/]\n"
46
- f"当前版本: [bold]{current_version}[/]",
47
- title_align="left"
48
- ))
43
+ console.print(f"当前版本: [bold]{current_version}[/]")
49
44
 
50
45
  # 获取可用版本
51
46
  with console.status("[bold green]正在获取版本信息...", spinner="dots"):
@@ -14,7 +14,6 @@ import sys
14
14
  import asyncio
15
15
  from argparse import ArgumentParser
16
16
  from rich.prompt import Confirm, Prompt
17
- from rich.panel import Panel
18
17
  from ..utils import PackageManager
19
18
  from ..console import console
20
19
  from ..base import Command
@@ -7,7 +7,6 @@ Uninstall 命令实现
7
7
  import sys
8
8
  from argparse import ArgumentParser
9
9
 
10
- from rich.panel import Panel
11
10
  from rich.prompt import Prompt
12
11
  from rich.table import Table
13
12
  from rich.box import SIMPLE
@@ -43,13 +42,6 @@ class UninstallCommand(Command):
43
42
  self._interactive_uninstall()
44
43
 
45
44
  def _interactive_uninstall(self):
46
- console.print(Panel(
47
- "[bold cyan]ErisPulse 卸载向导[/]\n"
48
- "选择要卸载的包",
49
- title="卸载向导",
50
- border_style="cyan"
51
- ))
52
-
53
45
  # 获取已安装的包
54
46
  installed = self.package_manager.get_installed_packages()
55
47
 
@@ -80,7 +72,7 @@ class UninstallCommand(Command):
80
72
 
81
73
  # 显示包列表
82
74
  table = Table(box=SIMPLE)
83
- table.add_column("序号", style="cyan")
75
+ table.add_column("序号", style="#A0B0C0")
84
76
  table.add_column("类型", style="bold")
85
77
  table.add_column("名称")
86
78
  table.add_column("包名")
@@ -12,7 +12,6 @@ Uninstall 命令实现
12
12
 
13
13
  import sys
14
14
  from argparse import ArgumentParser
15
- from rich.panel import Panel
16
15
  from rich.prompt import Prompt
17
16
  from rich.table import Table
18
17
  from rich.box import SIMPLE
@@ -0,0 +1,84 @@
1
+ import sys
2
+ from rich.console import Console
3
+ from rich.theme import Theme
4
+ from rich.highlighter import RegexHighlighter
5
+
6
+ BANNER = (
7
+ "\n\n"
8
+ "███████╗██████╗ ██╗███████╗██████╗ ██╗ ██╗██╗ ███████╗███████╗\n"
9
+ "██╔════╝██╔══██╗██║██╔════╝██╔══██╗██║ ██║██║ ██╔════╝██╔════╝\n"
10
+ "█████╗ ██████╔╝██║███████╗██████╔╝██║ ██║██║ ███████╗█████╗ \n"
11
+ "██╔══╝ ██╔══██╗██║╚════██║██╔═══╝ ██║ ██║██║ ╚════██║██╔══╝ \n"
12
+ "███████╗██║ ██║██║███████║██║ ╚██████╔╝███████╗███████║███████╗\n"
13
+ "╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═════╝ ╚══════╝╚══════╝╚══════╝\n"
14
+ "\n"
15
+ )
16
+
17
+ _BANNER_MINI = (
18
+ "\n\n"
19
+ "███████╗██████╗ ███████╗██████╗ ██╗ ██╗\n"
20
+ "██╔════╝██╔══██╗██╔════╝██╔══██╗██║ ██╔╝\n"
21
+ "█████╗ ██████╔╝███████╗██║ ██║█████╔╝ \n"
22
+ "██╔══╝ ██╔═══╝ ╚════██║██║ ██║██╔═██╗ \n"
23
+ "███████╗██║ ███████║██████╔╝██║ ██╗\n"
24
+ "╚══════╝╚═╝ ╚══════╝╚═════╝ ╚═╝ ╚═╝\n"
25
+ "\n"
26
+ )
27
+
28
+
29
+ _banner_printed = False
30
+
31
+ def print_banner():
32
+ global _banner_printed
33
+ if _banner_printed:
34
+ return
35
+ _banner_printed = True
36
+ width = console.width
37
+ if width >= 75:
38
+ console.print(BANNER, style="bold white", highlight=False)
39
+ else:
40
+ console.print(_BANNER_MINI, style="bold white", highlight=False)
41
+
42
+ class CommandHighlighter(RegexHighlighter):
43
+ """
44
+ 高亮CLI命令和参数
45
+
46
+ {!--< tips >!--}
47
+ 使用正则表达式匹配命令行参数和选项
48
+ {!--< /tips >!--}
49
+ """
50
+ highlights = [
51
+ r"(?P<switch>\-\-?\w+)",
52
+ r"(?P<option>\[\w+\])",
53
+ r"(?P<command>\b\w+\b)",
54
+ ]
55
+
56
+ # 主题配置
57
+ theme = Theme({
58
+ "info": "#A0B0C0",
59
+ "success": "#A5D6A7",
60
+ "warning": "#FFCC80",
61
+ "error": "#FFCDD2",
62
+ "title": "#7DBFE0",
63
+ "default": "default",
64
+ "progress": "#A5D6A7",
65
+ "progress.remaining": "#283545",
66
+ "cmd": "#90CAF9",
67
+ "param": "#80CBC4",
68
+ "switch": "#FFCC80",
69
+ "module": "#80CBC4",
70
+ "adapter": "#7DBFE0",
71
+ "cli": "#A0B0C0",
72
+ })
73
+
74
+ # 全局控制台实例
75
+ console = Console(
76
+ theme=theme,
77
+ color_system="auto",
78
+ highlighter=CommandHighlighter()
79
+ )
80
+
81
+ __all__ = [
82
+ "console",
83
+ "print_banner",
84
+ ]
@@ -9,6 +9,9 @@ from rich.console import Console
9
9
  from rich.theme import Theme
10
10
  from rich.highlighter import RegexHighlighter
11
11
 
12
+ def print_banner() -> ...:
13
+ ...
14
+
12
15
  class CommandHighlighter(RegexHighlighter):
13
16
  """
14
17
  高亮CLI命令和参数
@@ -40,7 +40,7 @@ class CommandRegistry:
40
40
  :raises ValueError: 命令名称已存在时抛出
41
41
  """
42
42
  if command.name in self._commands:
43
- raise ValueError(f"命令 '{command.name}' 已存在")
43
+ return
44
44
  self._commands[command.name] = command
45
45
 
46
46
  def get(self, name: str) -> Optional[Command]: