ErisPulse 2.4.8__tar.gz → 2.5.0.dev1__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 (186) hide show
  1. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/PKG-INFO +6 -3
  2. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/README.md +3 -1
  3. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/pyproject.toml +3 -2
  4. erispulse-2.5.0.dev1/src/ErisPulse/CLI/__init__.py +17 -0
  5. erispulse-2.5.0.dev1/src/ErisPulse/CLI/__init__.pyi +19 -0
  6. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/base.py +3 -1
  7. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/base.pyi +3 -1
  8. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/cli.py +46 -22
  9. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/cli.pyi +4 -4
  10. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/create.py +168 -63
  11. erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/create.pyi +98 -0
  12. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/init.py +235 -88
  13. erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/init.pyi +96 -0
  14. erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/install.py +563 -0
  15. erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/install.pyi +81 -0
  16. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/list.py +61 -21
  17. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/list.pyi +26 -3
  18. erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/list_remote.py +122 -0
  19. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/list_remote.pyi +20 -3
  20. erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/run.py +350 -0
  21. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/run.pyi +42 -4
  22. erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/self_update.py +310 -0
  23. erispulse-2.5.0.dev1/src/ErisPulse/CLI/commands/self_update.pyi +71 -0
  24. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/uninstall.py +41 -13
  25. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/uninstall.pyi +14 -2
  26. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/upgrade.py +24 -6
  27. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/upgrade.pyi +10 -1
  28. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/console.py +16 -1
  29. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/console.pyi +16 -1
  30. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/__init__.py +198 -0
  31. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/__init__.pyi +83 -0
  32. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/__init__.py +27 -0
  33. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/__init__.pyi +15 -0
  34. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/en.py +271 -0
  35. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/en.pyi +11 -0
  36. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/ja.py +271 -0
  37. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/ja.pyi +11 -0
  38. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/ru.py +271 -0
  39. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/ru.pyi +11 -0
  40. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/zh_cn.py +271 -0
  41. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/zh_cn.pyi +11 -0
  42. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/zh_tw.py +271 -0
  43. erispulse-2.5.0.dev1/src/ErisPulse/CLI/i18n/locales/zh_tw.pyi +11 -0
  44. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/registry.py +35 -6
  45. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/registry.pyi +21 -4
  46. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/utils/display.py +95 -1
  47. erispulse-2.5.0.dev1/src/ErisPulse/CLI/utils/display.pyi +115 -0
  48. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/utils/package_manager.py +328 -6
  49. erispulse-2.5.0.dev1/src/ErisPulse/CLI/utils/package_manager.pyi +365 -0
  50. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/adapter.py +72 -8
  51. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/adapter.pyi +12 -1
  52. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/__init__.py +9 -0
  53. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/__init__.pyi +1 -1
  54. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/command.py +8 -1
  55. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/command.pyi +3 -2
  56. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/wrapper.py +222 -153
  57. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/wrapper.pyi +68 -18
  58. erispulse-2.5.0.dev1/src/ErisPulse/Core/__init__.py +89 -0
  59. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/__init__.pyi +1 -0
  60. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/adapter.py +329 -70
  61. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/adapter.pyi +21 -5
  62. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/client.py +70 -21
  63. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/client.pyi +6 -5
  64. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/config.py +28 -7
  65. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/config.pyi +4 -3
  66. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/constants.py +23 -0
  67. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/__init__.py +548 -0
  68. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/__init__.pyi +150 -0
  69. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/constants.py +29 -0
  70. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/constants.pyi +11 -0
  71. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/__init__.py +44 -0
  72. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/__init__.pyi +15 -0
  73. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/en.py +305 -0
  74. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/en.pyi +11 -0
  75. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/ja.py +305 -0
  76. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/ja.pyi +11 -0
  77. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/ru.py +305 -0
  78. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/ru.pyi +11 -0
  79. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/zh_cn.py +305 -0
  80. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/zh_cn.pyi +11 -0
  81. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/zh_tw.py +305 -0
  82. erispulse-2.5.0.dev1/src/ErisPulse/Core/i18n/locales/zh_tw.pyi +11 -0
  83. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/lifecycle.py +58 -29
  84. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/lifecycle.pyi +3 -2
  85. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/logger.py +169 -28
  86. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/logger.pyi +60 -5
  87. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/module.py +112 -54
  88. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/module.pyi +6 -5
  89. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/router.py +274 -109
  90. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/router.pyi +30 -14
  91. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/storage.py +50 -32
  92. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/storage.pyi +5 -4
  93. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/__init__.py +9 -9
  94. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/__init__.pyi +2 -2
  95. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/adapter.py +33 -18
  96. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/adapter.pyi +4 -3
  97. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/module.py +54 -31
  98. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/module.pyi +7 -6
  99. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/__init__.py +19 -17
  100. erispulse-2.5.0.dev1/src/ErisPulse/runtime/__init__.pyi +19 -0
  101. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/config_schema.py +25 -1
  102. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/config_schema.pyi +9 -1
  103. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/exceptions.py +6 -9
  104. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/exceptions.pyi +3 -3
  105. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/frame_config.py +28 -10
  106. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/frame_config.pyi +10 -2
  107. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/sdk.py +212 -84
  108. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/sdk.pyi +5 -3
  109. erispulse-2.4.8/src/ErisPulse/CLI/__init__.py +0 -11
  110. erispulse-2.4.8/src/ErisPulse/CLI/__init__.pyi +0 -13
  111. erispulse-2.4.8/src/ErisPulse/CLI/commands/create.pyi +0 -44
  112. erispulse-2.4.8/src/ErisPulse/CLI/commands/init.pyi +0 -44
  113. erispulse-2.4.8/src/ErisPulse/CLI/commands/install.py +0 -302
  114. erispulse-2.4.8/src/ErisPulse/CLI/commands/install.pyi +0 -39
  115. erispulse-2.4.8/src/ErisPulse/CLI/commands/list_remote.py +0 -84
  116. erispulse-2.4.8/src/ErisPulse/CLI/commands/run.py +0 -243
  117. erispulse-2.4.8/src/ErisPulse/CLI/commands/self_update.py +0 -219
  118. erispulse-2.4.8/src/ErisPulse/CLI/commands/self_update.pyi +0 -37
  119. erispulse-2.4.8/src/ErisPulse/CLI/utils/display.pyi +0 -45
  120. erispulse-2.4.8/src/ErisPulse/CLI/utils/package_manager.pyi +0 -110
  121. erispulse-2.4.8/src/ErisPulse/Core/__init__.py +0 -86
  122. erispulse-2.4.8/src/ErisPulse/runtime/__init__.pyi +0 -19
  123. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/.gitignore +0 -0
  124. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/LICENSE +0 -0
  125. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/__init__.py +0 -0
  126. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
  127. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/utils/__init__.py +0 -0
  128. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
  129. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/__init__.py +0 -0
  130. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/__init__.pyi +0 -0
  131. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/client.py +0 -0
  132. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/client.pyi +0 -0
  133. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/errors.py +0 -0
  134. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/errors.pyi +0 -0
  135. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/manager.py +0 -0
  136. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
  137. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/module.py +0 -0
  138. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/module.pyi +0 -0
  139. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/router.py +0 -0
  140. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/router.pyi +0 -0
  141. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/storage.py +0 -0
  142. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/storage.pyi +0 -0
  143. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/websocket.py +0 -0
  144. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Bases/websocket.pyi +0 -0
  145. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/base.py +0 -0
  146. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/base.pyi +0 -0
  147. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/message.py +0 -0
  148. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/message.pyi +0 -0
  149. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/message_builder.py +0 -0
  150. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
  151. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/meta.py +0 -0
  152. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/meta.pyi +0 -0
  153. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/notice.py +0 -0
  154. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/notice.pyi +0 -0
  155. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/request.py +0 -0
  156. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/request.pyi +0 -0
  157. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/session_type.py +0 -0
  158. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
  159. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/Core/constants.pyi +0 -0
  160. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/__main__.py +0 -0
  161. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/__main__.pyi +0 -0
  162. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/__init__.py +0 -0
  163. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/__init__.pyi +0 -0
  164. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/adapter.py +0 -0
  165. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/adapter.pyi +0 -0
  166. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/bases/__init__.py +0 -0
  167. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
  168. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/bases/finder.py +0 -0
  169. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/bases/finder.pyi +0 -0
  170. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/module.py +0 -0
  171. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/finders/module.pyi +0 -0
  172. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/__init__.py +0 -0
  173. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/__init__.pyi +0 -0
  174. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/bases/__init__.py +0 -0
  175. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
  176. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/bases/loader.py +0 -0
  177. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
  178. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/strategy.py +0 -0
  179. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/loaders/strategy.pyi +0 -0
  180. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/context.py +0 -0
  181. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/runtime/context.pyi +0 -0
  182. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/4xx.png +0 -0
  183. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/5xx.png +0 -0
  184. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/__init__.py +0 -0
  185. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/__init__.pyi +0 -0
  186. {erispulse-2.4.8 → erispulse-2.5.0.dev1}/src/ErisPulse/web_status/unknow.png +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ErisPulse
3
- Version: 2.4.8
3
+ Version: 2.5.0.dev1
4
4
  Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
5
5
  Author-email: ErisDev <erisdev@88.com>
6
6
  Maintainer-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
@@ -48,8 +48,9 @@ Requires-Dist: packaging>=25.0
48
48
  Requires-Dist: pip>=23.0
49
49
  Requires-Dist: rich>=13.0.0
50
50
  Requires-Dist: toml>=0.10.2
51
- Requires-Dist: uvicorn[standard]>=0.30.0
51
+ Requires-Dist: uvicorn>=0.30.0
52
52
  Requires-Dist: watchdog>=4.0.0
53
+ Requires-Dist: websockets>=12.0
53
54
  Provides-Extra: dev
54
55
  Requires-Dist: httpx>=0.24.0; extra == 'dev'
55
56
  Requires-Dist: pyclean>=3.6.0; extra == 'dev'
@@ -79,7 +80,9 @@ Description-Content-Type: text/markdown
79
80
  </td>
80
81
  <td valign="middle">
81
82
 
82
- [English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
83
+ > [English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
84
+
85
+ > 🎉 **v2.5.0-dev.1 现已支持多语言!** 框架核心及 CLI 界面已内置中文(简/繁)、英文、日文、俄文支持,会自动检测您的系统语言切换!
83
86
 
84
87
  # ErisPulse
85
88
 
@@ -7,7 +7,9 @@
7
7
  </td>
8
8
  <td valign="middle">
9
9
 
10
- [English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
10
+ > [English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
11
+
12
+ > 🎉 **v2.5.0-dev.1 现已支持多语言!** 框架核心及 CLI 界面已内置中文(简/繁)、英文、日文、俄文支持,会自动检测您的系统语言切换!
11
13
 
12
14
  # ErisPulse
13
15
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ErisPulse"
7
- version = "2.4.8"
7
+ version = "2.5.0-dev.1"
8
8
  description = "ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -65,7 +65,8 @@ dependencies = [
65
65
  "watchdog>=4.0.0",
66
66
  "toml>=0.10.2",
67
67
  "fastapi>=0.116.1",
68
- "uvicorn[standard]>=0.30.0",
68
+ "uvicorn>=0.30.0",
69
+ "websockets>=12.0",
69
70
  "packaging>=25.0",
70
71
  ]
71
72
 
@@ -0,0 +1,17 @@
1
+ """
2
+ CLI 模块
3
+
4
+ ErisPulse 命令行接口
5
+
6
+ {!--< internal-use >!--}
7
+ CLI 拥有独立的国际化模块 (CLI.i18n),与 Core.i18n 完全解耦。
8
+ 此模块仅供内部使用,外部模块不应直接依赖 CLI.i18n。
9
+ {!--< /internal-use >!--}
10
+ """
11
+
12
+ from .cli import CLI
13
+ from .i18n import i18n as _cli_i18n
14
+
15
+ __all__ = [
16
+ "CLI",
17
+ ]
@@ -0,0 +1,19 @@
1
+ # type: ignore
2
+ #
3
+ # Auto-generated type stub for __init__.py
4
+ # DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
5
+ #
6
+
7
+ """
8
+ CLI 模块
9
+
10
+ ErisPulse 命令行接口
11
+
12
+ {!--< internal-use >!--}
13
+ CLI 拥有独立的国际化模块 (CLI.i18n),与 Core.i18n 完全解耦。
14
+ 此模块仅供内部使用,外部模块不应直接依赖 CLI.i18n。
15
+ {!--< /internal-use >!--}
16
+ """
17
+
18
+ from .cli import CLI
19
+ from .i18n import i18n as _cli_i18n
@@ -17,12 +17,14 @@ class Command(ABC):
17
17
  {!--< tips >!--}
18
18
  1. 每个命令类必须实现 add_arguments 和 execute 方法
19
19
  2. name 和 description 为类属性,必须在子类中定义
20
- 3. execute 方法接收解析后的 args 对象
20
+ 3. aliases 为可选类属性,用于定义命令的简化形式
21
+ 4. execute 方法接收解析后的 args 对象
21
22
  {!--< /tips >!--}
22
23
  """
23
24
 
24
25
  name: str = "" # 命令名称
25
26
  description: str = "" # 命令描述
27
+ aliases: list = [] # 命令别名(简化形式,如 "install" -> ["i", "add"])
26
28
 
27
29
  @abstractmethod
28
30
  def add_arguments(self, parser: ArgumentParser):
@@ -22,11 +22,13 @@ class Command(ABC):
22
22
  {!--< tips >!--}
23
23
  1. 每个命令类必须实现 add_arguments 和 execute 方法
24
24
  2. name 和 description 为类属性,必须在子类中定义
25
- 3. execute 方法接收解析后的 args 对象
25
+ 3. aliases 为可选类属性,用于定义命令的简化形式
26
+ 4. execute 方法接收解析后的 args 对象
26
27
  {!--< /tips >!--}
27
28
  """
28
29
  name: str
29
30
  description: str
31
+ aliases: list
30
32
  def add_arguments(self: object, parser: ArgumentParser) -> ...:
31
33
  """
32
34
  添加命令参数
@@ -4,19 +4,19 @@
4
4
  ErisPulse 命令行接口主入口
5
5
  """
6
6
 
7
- import sys
8
7
  import importlib
9
- import traceback
10
8
  import pkgutil
9
+ import sys
10
+ import traceback
11
11
  from argparse import ArgumentParser, RawDescriptionHelpFormatter
12
12
 
13
13
  from rich.panel import Panel
14
14
  from rich.text import Text
15
15
 
16
+ from .base import Command
16
17
  from .console import console, print_banner
18
+ from .i18n import i18n
17
19
  from .registry import CommandRegistry
18
- from .base import Command
19
- from .utils.display import section_header
20
20
 
21
21
 
22
22
  class CLI:
@@ -41,24 +41,31 @@ class CLI:
41
41
  parser = ArgumentParser(
42
42
  prog="epsdk",
43
43
  formatter_class=RawDescriptionHelpFormatter,
44
- description="ErisPulse SDK 命令行工具",
44
+ description=i18n.t("cli.parser.description"),
45
45
  )
46
46
  parser._positionals.title = "命令"
47
47
  parser._optionals.title = "选项"
48
48
 
49
49
  # 全局选项
50
- parser.add_argument("--version", "-V", action="store_true", help="显示版本信息")
50
+ parser.add_argument(
51
+ "--version",
52
+ "-V",
53
+ action="store_true",
54
+ help=i18n.t("cli.parser.version_help"),
55
+ )
51
56
  parser.add_argument(
52
57
  "--verbose",
53
58
  "-v",
54
59
  action="count",
55
60
  default=0,
56
- help="增加输出详细程度 (-v, -vv, -vvv)",
61
+ help=i18n.t("cli.parser.verbose_help"),
57
62
  )
58
63
 
59
64
  # 子命令
60
65
  subparsers = parser.add_subparsers(
61
- dest="command", metavar="<命令>", help="要执行的操作"
66
+ dest="command",
67
+ metavar=i18n.t("cli.parser.command_meta"),
68
+ help=i18n.t("cli.parser.command_help"),
62
69
  )
63
70
 
64
71
  self.subparsers = subparsers
@@ -104,22 +111,30 @@ class CLI:
104
111
  self.registry.register(command_instance)
105
112
  except Exception as e:
106
113
  console.print(
107
- f"[warning]实例化命令 {attr_name} 失败: {e}[/]"
114
+ f"[warning]{i18n.t('cli.discover.instantiate_failed', name=attr_name, error=e)}[/]"
108
115
  )
109
116
 
110
117
  except Exception as e:
111
- console.print(f"[warning]加载命令模块 {module_name} 失败: {e}[/]")
118
+ console.print(
119
+ f"[warning]{i18n.t('cli.discover.load_failed', name=module_name, error=e)}[/]"
120
+ )
112
121
 
113
122
  except ImportError as e:
114
- console.print(f"[warning]无法导入 commands 包: {e}[/]")
123
+ console.print(
124
+ f"[warning]{i18n.t('cli.discover.import_failed', error=e)}[/]"
125
+ )
115
126
 
116
127
  def _register_builtin_commands(self):
117
128
  """注册所有内置命令(通过自动发现)"""
118
129
  self._auto_discover_commands()
119
130
 
120
- # 添加所有命令的参数
131
+ # 添加所有命令的参数(同时注册命令别名)
121
132
  for command in self.registry.get_all():
122
- parser = self.subparsers.add_parser(command.name, help=command.description)
133
+ parser = self.subparsers.add_parser(
134
+ command.name,
135
+ aliases=getattr(command, "aliases", None) or [],
136
+ help=command.description,
137
+ )
123
138
  command.add_arguments(parser)
124
139
 
125
140
  def _print_version(self):
@@ -128,7 +143,7 @@ class CLI:
128
143
 
129
144
  console.print(
130
145
  Panel(
131
- f"[title]ErisPulse SDK[/] 版本: [bold]{__version__}[/]",
146
+ f"[title]{i18n.t('cli.run.version_text', version=__version__)}[/]",
132
147
  subtitle=f"Python {sys.version.split()[0]}",
133
148
  style="title",
134
149
  )
@@ -154,35 +169,44 @@ class CLI:
154
169
  # 没有指定命令时显示帮助
155
170
  if not args.command:
156
171
  if unknown:
157
- console.print(f"[warning]未识别的参数: {' '.join(unknown)}[/]")
172
+ console.print(
173
+ f"[warning]{i18n.t('cli.run.unknown_args', args=' '.join(unknown))}[/]"
174
+ )
158
175
  self.parser.print_help()
159
176
  return
160
177
 
161
- if unknown and args.command not in ("install", "create"):
162
- console.print(f"[warning]未识别的参数: {' '.join(unknown)}[/]")
178
+ # 将别名解析为规范命令名
179
+ canonical = self.registry.resolve(args.command) or args.command
180
+
181
+ if unknown and canonical not in ("install", "create"):
182
+ console.print(
183
+ f"[warning]{i18n.t('cli.run.unknown_args', args=' '.join(unknown))}[/]"
184
+ )
163
185
 
164
186
  try:
165
187
  # 执行命令
166
- command = self.registry.get(args.command)
188
+ command = self.registry.get(canonical)
167
189
  if command:
168
190
  console.print()
169
191
  console.print(
170
- Text(f" ── ", style="dim"),
192
+ Text(" ── ", style="dim"),
171
193
  Text(command.description, style="bold"),
172
194
  sep="",
173
195
  )
174
196
  console.print()
175
197
  command.execute(args)
176
198
  else:
177
- console.print(f"[error]未知命令: {args.command}[/]")
199
+ console.print(
200
+ f"[error]{i18n.t('cli.run.unknown_command', command=args.command)}[/]"
201
+ )
178
202
  self.parser.print_help()
179
203
  sys.exit(1)
180
204
 
181
205
  except KeyboardInterrupt:
182
- console.print("\n[warning]操作被用户中断[/]")
206
+ console.print(f"\n[warning]{i18n.t('cli.run.user_interrupted')}[/]")
183
207
  sys.exit(1)
184
208
  except Exception as e:
185
- console.print(f"[error]执行命令时出错: {e}[/]")
209
+ console.print(f"[error]{i18n.t('cli.run.exec_error', error=e)}[/]")
186
210
  if args.verbose >= 1:
187
211
  console.print(traceback.format_exc())
188
212
  sys.exit(1)
@@ -10,17 +10,17 @@
10
10
  ErisPulse 命令行接口主入口
11
11
  """
12
12
 
13
- import sys
14
13
  import importlib
15
- import traceback
16
14
  import pkgutil
15
+ import sys
16
+ import traceback
17
17
  from argparse import ArgumentParser, RawDescriptionHelpFormatter
18
18
  from rich.panel import Panel
19
19
  from rich.text import Text
20
+ from .base import Command
20
21
  from .console import console, print_banner
22
+ from .i18n import i18n
21
23
  from .registry import CommandRegistry
22
- from .base import Command
23
- from .utils.display import section_header
24
24
 
25
25
  class CLI:
26
26
  """
@@ -4,18 +4,18 @@ Create 命令实现
4
4
  脚手架工具,快速创建 Module / Adapter 项目模板
5
5
  """
6
6
 
7
- import sys
8
7
  import datetime
8
+ import sys
9
9
  from argparse import ArgumentParser
10
10
  from pathlib import Path
11
11
 
12
- from rich.prompt import Prompt, IntPrompt
12
+ from rich.prompt import IntPrompt, Prompt
13
13
  from rich.text import Text
14
14
 
15
- from ..console import console
16
15
  from ..base import Command
17
- from ..utils.display import section_header
18
-
16
+ from ..console import console
17
+ from ..i18n import i18n
18
+ from ..utils.display import prompt_validated, section_header
19
19
 
20
20
  _LICENSE_TEMPLATE = """MIT License
21
21
 
@@ -474,6 +474,12 @@ token = ""
474
474
 
475
475
 
476
476
  def _camel_to_snake(name: str) -> str:
477
+ """
478
+ 将 PascalCase/CamelCase 名称转换为 snake_case
479
+
480
+ :param name: [str] 原始名称
481
+ :return: [str] 转换后的 snake_case 名称
482
+ """
477
483
  import re
478
484
 
479
485
  s = re.sub(r"(?<=[a-z0-9])([A-Z])", r"_\1", name)
@@ -482,10 +488,24 @@ def _camel_to_snake(name: str) -> str:
482
488
 
483
489
 
484
490
  def _to_converter_name(name: str) -> str:
491
+ """
492
+ 根据适配器名称生成转换器类名
493
+
494
+ :param name: [str] 适配器名称
495
+ :return: [str] 转换器类名(名称后追加 Converter)
496
+ """
485
497
  return f"{name}Converter"
486
498
 
487
499
 
488
500
  def _validate_name(name: str) -> bool:
501
+ """
502
+ 校验项目/模块/适配器名称是否合法
503
+
504
+ 名称必须以字母开头,且只能包含字母、数字和下划线。
505
+
506
+ :param name: [str] 待校验的名称
507
+ :return: [bool] 合法返回 True,否则 False
508
+ """
489
509
  if not name:
490
510
  return False
491
511
  if not name[0].isalpha():
@@ -494,26 +514,41 @@ def _validate_name(name: str) -> bool:
494
514
 
495
515
 
496
516
  class CreateCommand(Command):
517
+ """
518
+ create 命令
519
+
520
+ 脚手架工具,快速创建 Module / Adapter 项目模板
521
+ """
522
+
497
523
  name = "create"
498
- description = "创建 Module / Adapter 项目脚手架"
524
+ description = i18n.t("cli.create.description")
525
+ aliases = ["c", "new"]
499
526
 
500
527
  def add_arguments(self, parser: ArgumentParser):
501
528
  parser.add_argument(
502
529
  "create_type",
503
530
  nargs="?",
504
531
  choices=["module", "adapter"],
505
- help="创建类型: module 或 adapter",
532
+ help=i18n.t("cli.create.type_help"),
533
+ )
534
+ parser.add_argument("--name", "-n", help=i18n.t("cli.create.name_help"))
535
+ parser.add_argument(
536
+ "--description", "-d", help=i18n.t("cli.create.desc_help"), default=""
537
+ )
538
+ parser.add_argument(
539
+ "--author", "-a", help=i18n.t("cli.create.author_help"), default=""
540
+ )
541
+ parser.add_argument(
542
+ "--email", "-e", help=i18n.t("cli.create.email_help"), default=""
543
+ )
544
+ parser.add_argument(
545
+ "--homepage", help=i18n.t("cli.create.homepage_help"), default=""
506
546
  )
507
- parser.add_argument("--name", "-n", help="项目/模块/适配器名称 (PascalCase)")
508
- parser.add_argument("--description", "-d", help="项目描述", default="")
509
- parser.add_argument("--author", "-a", help="作者名称", default="")
510
- parser.add_argument("--email", "-e", help="作者邮箱", default="")
511
- parser.add_argument("--homepage", help="项目主页 URL", default="")
512
547
  parser.add_argument(
513
- "--output", "-o", help="输出目录 (默认当前目录)", default="."
548
+ "--output", "-o", help=i18n.t("cli.create.output_help"), default="."
514
549
  )
515
550
  parser.add_argument(
516
- "--force", "-f", action="store_true", help="强制覆盖已存在的目录"
551
+ "--force", "-f", action="store_true", help=i18n.t("cli.create.force_help")
517
552
  )
518
553
 
519
554
  def execute(self, args):
@@ -521,14 +556,16 @@ class CreateCommand(Command):
521
556
  if not create_type:
522
557
  create_type = self._interactive_select_type()
523
558
 
559
+ default_name = "MyModule" if create_type == "module" else "MyAdapter"
524
560
  name = args.name
525
- if not name:
526
- default_name = "MyModule" if create_type == "module" else "MyAdapter"
527
- name = Prompt.ask(" 名称 (PascalCase)", default=default_name)
528
-
529
- if not _validate_name(name):
530
- console.print("[error] 名称必须以字母开头,只能包含字母、数字和下划线")
531
- sys.exit(1)
561
+ # 名称校验:非法时保留输入并重新提示,而非直接退出
562
+ if not (name and _validate_name(name)):
563
+ name = prompt_validated(
564
+ i18n.t("cli.create.name_prompt"),
565
+ default=name or default_name,
566
+ validate=_validate_name,
567
+ error_msg=i18n.t("cli.create.name_error"),
568
+ )
532
569
 
533
570
  if create_type == "module":
534
571
  self._create_module(args, name)
@@ -536,37 +573,76 @@ class CreateCommand(Command):
536
573
  self._create_adapter(args, name)
537
574
 
538
575
  def _interactive_select_type(self) -> str:
539
- section_header("选择创建类型")
540
- console.print(" [bold]1.[/] Module [dim]— 自定义功能模块[/]")
541
- console.print(" [bold]2.[/] Adapter [dim]— 平台适配器[/]")
576
+ """
577
+ 交互式选择创建类型(Module 或 Adapter)
578
+
579
+ :return: [str] 返回 "module" 或 "adapter"
580
+ """
581
+ section_header(i18n.t("cli.create.select_type_title"))
582
+ console.print(
583
+ f" [bold]1.[/] Module [dim]{i18n.t('cli.create.select_type_module')}[/]"
584
+ )
585
+ console.print(
586
+ f" [bold]2.[/] Adapter [dim]{i18n.t('cli.create.select_type_adapter')}[/]"
587
+ )
542
588
  console.print()
543
- choice = IntPrompt.ask(" 请选择", default=1, choices=["1", "2"])
589
+ choice = IntPrompt.ask(
590
+ i18n.t("cli.create.select_prompt"), default=1, choices=["1", "2"]
591
+ )
544
592
  console.print()
545
593
  return "module" if choice == 1 else "adapter"
546
594
 
547
595
  def _ask_missing(
548
596
  self, args, field_name: str, prompt_text: str, default: str = ""
549
597
  ) -> str:
598
+ """
599
+ 获取参数值,若缺失则交互式提示输入
600
+
601
+ :param args: [Any] 解析后的命令参数对象
602
+ :param field_name: [str] 参数字段名
603
+ :param prompt_text: [str] 提示文本
604
+ :param default: [str] 默认值 (默认: "")
605
+ :return: [str] 获取到的参数值
606
+ """
550
607
  val = getattr(args, field_name, None) or ""
551
608
  if not val:
552
609
  val = Prompt.ask(f" {prompt_text}", default=default)
553
610
  return val
554
611
 
555
612
  def _create_module(self, args, name: str):
613
+ """
614
+ 创建 Module 项目脚手架
615
+
616
+ :param args: [Any] 解析后的命令参数对象
617
+ :param name: [str] 模块名称
618
+ :return: [None] 无返回值
619
+ """
556
620
  description = self._ask_missing(
557
- args, "description", "模块描述", f"一个非常哇塞的{name}模块"
621
+ args,
622
+ "description",
623
+ i18n.t("cli.create.module_desc_prompt"),
624
+ i18n.t("cli.create.module_desc_placeholder", name=name),
625
+ )
626
+ author = self._ask_missing(
627
+ args, "author", i18n.t("cli.create.author_prompt"), "yourname"
628
+ )
629
+ email = self._ask_missing(
630
+ args, "email", i18n.t("cli.create.email_prompt"), "your@mail.com"
558
631
  )
559
- author = self._ask_missing(args, "author", "作者名称", "yourname")
560
- email = self._ask_missing(args, "email", "作者邮箱", "your@mail.com")
561
632
  homepage = self._ask_missing(
562
- args, "homepage", "项目主页", f"https://github.com/{author}/{name}"
633
+ args,
634
+ "homepage",
635
+ i18n.t("cli.create.homepage_prompt"),
636
+ f"https://github.com/{author}/{name}",
563
637
  )
564
638
 
565
639
  output = Path(args.output)
566
640
  project_dir = output / name
567
641
 
568
642
  if project_dir.exists() and not args.force:
569
- console.print(f"[error] 目录 {project_dir} 已存在,使用 --force 覆盖")
643
+ console.print(
644
+ f"[error] {i18n.t('cli.create.dir_exists', dir=str(project_dir))}"
645
+ )
570
646
  sys.exit(1)
571
647
 
572
648
  try:
@@ -600,35 +676,56 @@ class CreateCommand(Command):
600
676
  )
601
677
 
602
678
  console.print()
603
- console.print(f"[success] Module 项目 [{name}] 创建成功[/]")
679
+ console.print(
680
+ f"[success] {i18n.t('cli.create.module_created', name=name)}[/]"
681
+ )
604
682
  console.print()
605
- console.print(Text(" 项目结构:", style="bold"))
683
+ console.print(Text(i18n.t("cli.create.project_structure"), style="bold"))
606
684
  console.print(f" {name}/")
607
- console.print(f" ├── pyproject.toml")
608
- console.print(f" ├── LICENSE")
609
- console.print(f" ├── README.md")
685
+ console.print(" ├── pyproject.toml")
686
+ console.print(" ├── LICENSE")
687
+ console.print(" ├── README.md")
610
688
  console.print(f" └── {name}/")
611
- console.print(f" ├── __init__.py")
612
- console.print(f" └── Core.py")
689
+ console.print(" ├── __init__.py")
690
+ console.print(" └── Core.py")
613
691
  console.print()
614
- console.print(Text(" 接下来:", style="bold"))
615
- console.print(f" · cd {name}")
616
- console.print(f" · 编辑 {name}/Core.py 实现模块逻辑")
617
- console.print(f" · pip install -e . (开发模式安装)")
618
- console.print(f" · epsdk run (运行测试)")
692
+ console.print(Text(i18n.t("cli.create.next_steps"), style="bold"))
693
+ console.print(f" · {i18n.t('cli.create.cd_to', dir=name)}")
694
+ console.print(
695
+ f" · {i18n.t('cli.create.edit_module', file=name + '/Core.py')}"
696
+ )
697
+ console.print(f" · {i18n.t('cli.create.install_dev')}")
698
+ console.print(f" · {i18n.t('cli.create.run_test')}")
619
699
 
620
700
  except Exception as e:
621
- console.print(f"[error] 创建失败: {e}")
701
+ console.print(f"[error] {i18n.t('cli.create.failed', error=e)}")
622
702
  sys.exit(1)
623
703
 
624
704
  def _create_adapter(self, args, name: str):
705
+ """
706
+ 创建 Adapter 项目脚手架
707
+
708
+ :param args: [Any] 解析后的命令参数对象
709
+ :param name: [str] 适配器名称
710
+ :return: [None] 无返回值
711
+ """
625
712
  description = self._ask_missing(
626
- args, "description", "适配器描述", f"{name}平台适配器"
713
+ args,
714
+ "description",
715
+ i18n.t("cli.create.adapter_desc_prompt"),
716
+ i18n.t("cli.create.adapter_desc_placeholder", name=name),
717
+ )
718
+ author = self._ask_missing(
719
+ args, "author", i18n.t("cli.create.author_prompt"), "yourname"
720
+ )
721
+ email = self._ask_missing(
722
+ args, "email", i18n.t("cli.create.email_prompt"), "your@mail.com"
627
723
  )
628
- author = self._ask_missing(args, "author", "作者名称", "yourname")
629
- email = self._ask_missing(args, "email", "作者邮箱", "your@mail.com")
630
724
  homepage = self._ask_missing(
631
- args, "homepage", "项目主页", f"https://github.com/{author}/{name}"
725
+ args,
726
+ "homepage",
727
+ i18n.t("cli.create.homepage_prompt"),
728
+ f"https://github.com/{author}/{name}",
632
729
  )
633
730
 
634
731
  converter_name = _to_converter_name(name)
@@ -637,7 +734,9 @@ class CreateCommand(Command):
637
734
  project_dir = output / name
638
735
 
639
736
  if project_dir.exists() and not args.force:
640
- console.print(f"[error] 目录 {project_dir} 已存在,使用 --force 覆盖")
737
+ console.print(
738
+ f"[error] {i18n.t('cli.create.dir_exists', dir=str(project_dir))}"
739
+ )
641
740
  sys.exit(1)
642
741
 
643
742
  try:
@@ -686,25 +785,31 @@ class CreateCommand(Command):
686
785
  )
687
786
 
688
787
  console.print()
689
- console.print(f"[success] Adapter 项目 [{name}] 创建成功[/]")
788
+ console.print(
789
+ f"[success] {i18n.t('cli.create.adapter_created', name=name)}[/]"
790
+ )
690
791
  console.print()
691
- console.print(Text(" 项目结构:", style="bold"))
792
+ console.print(Text(i18n.t("cli.create.project_structure"), style="bold"))
692
793
  console.print(f" {name}/")
693
- console.print(f" ├── pyproject.toml")
694
- console.print(f" ├── LICENSE")
695
- console.print(f" ├── README.md")
794
+ console.print(" ├── pyproject.toml")
795
+ console.print(" ├── LICENSE")
796
+ console.print(" ├── README.md")
696
797
  console.print(f" └── {name}/")
697
- console.print(f" ├── __init__.py")
698
- console.print(f" ├── Core.py")
699
- console.print(f" └── Converter.py")
798
+ console.print(" ├── __init__.py")
799
+ console.print(" ├── Core.py")
800
+ console.print(" └── Converter.py")
700
801
  console.print()
701
- console.print(Text(" 接下来:", style="bold"))
702
- console.print(f" · cd {name}")
703
- console.print(f" · 编辑 {name}/Core.py 实现适配器逻辑")
704
- console.print(f" · 编辑 {name}/Converter.py 实现消息格式转换")
705
- console.print(f" · pip install -e . (开发模式安装)")
706
- console.print(f" · epsdk run (运行测试)")
802
+ console.print(Text(i18n.t("cli.create.next_steps"), style="bold"))
803
+ console.print(f" · {i18n.t('cli.create.cd_to', dir=name)}")
804
+ console.print(
805
+ f" · {i18n.t('cli.create.edit_adapter', file=name + '/Core.py')}"
806
+ )
807
+ console.print(
808
+ f" · {i18n.t('cli.create.edit_converter', file=name + '/Converter.py')}"
809
+ )
810
+ console.print(f" · {i18n.t('cli.create.install_dev')}")
811
+ console.print(f" · {i18n.t('cli.create.run_test')}")
707
812
 
708
813
  except Exception as e:
709
- console.print(f"[error] 创建失败: {e}")
814
+ console.print(f"[error] {i18n.t('cli.create.failed', error=e)}")
710
815
  sys.exit(1)