ErisPulse 2.3.3.dev0__py3-none-any.whl → 2.3.4.dev2__py3-none-any.whl

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 (97) hide show
  1. ErisPulse/CLI/__init__.py +11 -0
  2. ErisPulse/CLI/__init__.pyi +13 -0
  3. ErisPulse/CLI/base.py +52 -0
  4. ErisPulse/CLI/base.pyi +50 -0
  5. ErisPulse/CLI/cli.py +224 -0
  6. ErisPulse/CLI/cli.pyi +80 -0
  7. ErisPulse/CLI/commands/__init__.py +6 -0
  8. ErisPulse/CLI/commands/__init__.pyi +12 -0
  9. ErisPulse/CLI/commands/init.py +395 -0
  10. ErisPulse/CLI/commands/init.pyi +70 -0
  11. ErisPulse/CLI/commands/install.py +302 -0
  12. ErisPulse/CLI/commands/install.pyi +58 -0
  13. ErisPulse/CLI/commands/list.py +160 -0
  14. ErisPulse/CLI/commands/list.pyi +44 -0
  15. ErisPulse/CLI/commands/list_remote.py +123 -0
  16. ErisPulse/CLI/commands/list_remote.pyi +35 -0
  17. ErisPulse/CLI/commands/run.py +108 -0
  18. ErisPulse/CLI/commands/run.pyi +39 -0
  19. ErisPulse/CLI/commands/self_update.py +232 -0
  20. ErisPulse/CLI/commands/self_update.pyi +47 -0
  21. ErisPulse/CLI/commands/uninstall.py +32 -0
  22. ErisPulse/CLI/commands/uninstall.pyi +24 -0
  23. ErisPulse/CLI/commands/upgrade.py +56 -0
  24. ErisPulse/CLI/commands/upgrade.pyi +25 -0
  25. ErisPulse/CLI/console.pyi +20 -0
  26. ErisPulse/CLI/registry.py +112 -0
  27. ErisPulse/CLI/registry.pyi +99 -0
  28. ErisPulse/{utils → CLI/utils}/__init__.py +2 -6
  29. ErisPulse/CLI/utils/__init__.pyi +14 -0
  30. ErisPulse/{utils → CLI/utils}/package_manager.py +146 -20
  31. ErisPulse/CLI/utils/package_manager.pyi +241 -0
  32. ErisPulse/{utils → CLI/utils}/reload_handler.py +7 -8
  33. ErisPulse/CLI/utils/reload_handler.pyi +64 -0
  34. ErisPulse/Core/Bases/__init__.pyi +14 -0
  35. ErisPulse/Core/Bases/adapter.py +13 -1
  36. ErisPulse/Core/Bases/adapter.pyi +140 -0
  37. ErisPulse/Core/Bases/manager.py +136 -0
  38. ErisPulse/Core/Bases/manager.pyi +108 -0
  39. ErisPulse/Core/Bases/module.py +53 -1
  40. ErisPulse/Core/Bases/module.pyi +95 -0
  41. ErisPulse/Core/Event/__init__.pyi +26 -0
  42. ErisPulse/Core/Event/base.pyi +62 -0
  43. ErisPulse/Core/Event/command.py +6 -1
  44. ErisPulse/Core/Event/command.pyi +113 -0
  45. ErisPulse/Core/Event/exceptions.pyi +43 -0
  46. ErisPulse/Core/Event/message.pyi +93 -0
  47. ErisPulse/Core/Event/meta.pyi +92 -0
  48. ErisPulse/Core/Event/notice.pyi +108 -0
  49. ErisPulse/Core/Event/request.pyi +76 -0
  50. ErisPulse/Core/Event/wrapper.py +2 -3
  51. ErisPulse/Core/Event/wrapper.pyi +403 -0
  52. ErisPulse/Core/__init__.py +16 -13
  53. ErisPulse/Core/__init__.pyi +16 -0
  54. ErisPulse/Core/_self_config.py +1 -1
  55. ErisPulse/Core/_self_config.pyi +72 -0
  56. ErisPulse/Core/adapter.py +70 -10
  57. ErisPulse/Core/adapter.pyi +246 -0
  58. ErisPulse/Core/config.pyi +70 -0
  59. ErisPulse/Core/exceptions.py +4 -2
  60. ErisPulse/Core/exceptions.pyi +60 -0
  61. ErisPulse/Core/lifecycle.py +15 -1
  62. ErisPulse/Core/lifecycle.pyi +92 -0
  63. ErisPulse/Core/logger.py +21 -15
  64. ErisPulse/Core/logger.pyi +169 -0
  65. ErisPulse/Core/module.py +57 -9
  66. ErisPulse/Core/module.pyi +189 -0
  67. ErisPulse/Core/router.py +13 -5
  68. ErisPulse/Core/router.pyi +120 -0
  69. ErisPulse/Core/storage.py +94 -256
  70. ErisPulse/Core/storage.pyi +220 -0
  71. ErisPulse/__init__.py +35 -1236
  72. ErisPulse/__init__.pyi +22 -0
  73. ErisPulse/__main__.py +1 -1
  74. ErisPulse/__main__.pyi +24 -0
  75. ErisPulse/loaders/__init__.py +22 -0
  76. ErisPulse/loaders/__init__.pyi +21 -0
  77. ErisPulse/loaders/adapter_loader.py +187 -0
  78. ErisPulse/loaders/adapter_loader.pyi +82 -0
  79. ErisPulse/loaders/base_loader.py +162 -0
  80. ErisPulse/loaders/base_loader.pyi +23 -0
  81. ErisPulse/loaders/initializer.py +150 -0
  82. ErisPulse/loaders/initializer.pyi +60 -0
  83. ErisPulse/loaders/module_loader.py +618 -0
  84. ErisPulse/loaders/module_loader.pyi +179 -0
  85. ErisPulse/loaders/strategy.py +129 -0
  86. ErisPulse/loaders/strategy.pyi +90 -0
  87. ErisPulse/sdk.py +435 -0
  88. ErisPulse/sdk.pyi +158 -0
  89. {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/METADATA +6 -20
  90. erispulse-2.3.4.dev2.dist-info/RECORD +103 -0
  91. {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/licenses/LICENSE +3 -3
  92. ErisPulse/Core/ux.py +0 -635
  93. ErisPulse/utils/cli.py +0 -1097
  94. erispulse-2.3.3.dev0.dist-info/RECORD +0 -35
  95. /ErisPulse/{utils → CLI}/console.py +0 -0
  96. {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/WHEEL +0 -0
  97. {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,302 @@
1
+ """
2
+ Install 命令实现
3
+
4
+ 支持交互式和批量安装模块、适配器、CLI 扩展
5
+ """
6
+
7
+ import sys
8
+ import asyncio
9
+ from argparse import ArgumentParser
10
+
11
+ from rich.panel import Panel
12
+ from rich.prompt import Confirm, Prompt
13
+ from rich.table import Table
14
+ from rich.box import SIMPLE
15
+
16
+ from ..utils import PackageManager
17
+ from ..console import console
18
+ from ..base import Command
19
+
20
+
21
+ class InstallCommand(Command):
22
+ name = "install"
23
+ description = "安装模块/适配器包(不指定包名时进入交互式安装)"
24
+
25
+ def __init__(self):
26
+ self.package_manager = PackageManager()
27
+
28
+ def add_arguments(self, parser: ArgumentParser):
29
+ parser.add_argument(
30
+ 'package',
31
+ nargs='*',
32
+ help='要安装的包名或模块/适配器简称(可指定多个)'
33
+ )
34
+ parser.add_argument(
35
+ '--upgrade', '-U',
36
+ action='store_true',
37
+ help='升级已安装的包'
38
+ )
39
+ parser.add_argument(
40
+ '--pre',
41
+ action='store_true',
42
+ help='包含预发布版本'
43
+ )
44
+
45
+ def execute(self, args):
46
+ if args.package:
47
+ # 批量安装
48
+ success = self.package_manager.install_package(
49
+ args.package,
50
+ upgrade=args.upgrade,
51
+ pre=args.pre
52
+ )
53
+ if not success:
54
+ sys.exit(1)
55
+ else:
56
+ # 交互式安装
57
+ self._interactive_install(args.upgrade, args.pre)
58
+
59
+ def _interactive_install(self, upgrade: bool = False, pre: bool = False):
60
+ """
61
+ 交互式安装界面
62
+
63
+ :param upgrade: 是否升级模式
64
+ :param pre: 是否包含预发布版本
65
+ """
66
+ console.print(Panel(
67
+ "[bold cyan]ErisPulse 交互式安装向导[/]\n"
68
+ "选择您要安装的组件类型",
69
+ title="欢迎",
70
+ border_style="cyan"
71
+ ))
72
+
73
+ # 预加载远程包列表,避免每次选择都请求
74
+ console.print("[info]正在获取远程包列表...[/]")
75
+ remote_packages = asyncio.run(self.package_manager.get_remote_packages())
76
+ console.print("[success]远程包列表获取完成[/]")
77
+ console.print("")
78
+
79
+ while True:
80
+ console.print("[bold cyan]请选择组件类型:[/]")
81
+ console.print(" 1. 适配器")
82
+ console.print(" 2. 模块")
83
+ console.print(" 3. CLI 扩展")
84
+ console.print(" 4. 自定义安装")
85
+ console.print(" q. 退出")
86
+
87
+ choice = Prompt.ask(
88
+ "\n请输入选项 [1/2/3/4/q]",
89
+ choices=["1", "2", "3", "4", "q"],
90
+ default="q"
91
+ )
92
+
93
+ if choice == "q":
94
+ console.print("[info]退出安装向导[/]")
95
+ break
96
+
97
+ elif choice == "1":
98
+ self._install_adapters(remote_packages, upgrade, pre)
99
+ elif choice == "2":
100
+ self._install_modules(remote_packages, upgrade, pre)
101
+ elif choice == "3":
102
+ self._install_cli_extensions(remote_packages, upgrade, pre)
103
+ elif choice == "4":
104
+ self._install_custom(upgrade, pre)
105
+
106
+ # 询问是否继续
107
+ if not Confirm.ask("\n[cyan]是否继续安装其他组件?[/cyan]", default=False):
108
+ break
109
+
110
+ def _install_adapters(self, remote_packages: dict, upgrade: bool, pre: bool):
111
+ """安装适配器"""
112
+ console.print("\n[bold]可用的适配器:[/bold]")
113
+
114
+ adapters = remote_packages.get("adapters", {})
115
+
116
+ if not adapters:
117
+ console.print("[yellow]没有可用的适配器[/yellow]")
118
+ return
119
+
120
+ # 显示适配器列表
121
+ table = Table(box=SIMPLE, header_style="adapter")
122
+ table.add_column("序号", style="cyan")
123
+ table.add_column("适配器名", style="adapter")
124
+ table.add_column("包名")
125
+ table.add_column("描述")
126
+
127
+ adapter_list = list(adapters.items())
128
+ for i, (name, info) in enumerate(adapter_list, 1):
129
+ table.add_row(
130
+ str(i),
131
+ name,
132
+ info.get("package", ""),
133
+ info.get("description", "")
134
+ )
135
+
136
+ console.print(table)
137
+
138
+ # 选择适配器
139
+ selected = Prompt.ask(
140
+ "\n[cyan]请输入要安装的适配器序号(多个用逗号分隔,如: 1,3)或按 q 返回:[/cyan]"
141
+ )
142
+
143
+ if selected.lower() == 'q':
144
+ return
145
+
146
+ try:
147
+ indices = [int(idx.strip()) for idx in selected.split(",")]
148
+ selected_packages = []
149
+
150
+ for idx in indices:
151
+ if 1 <= idx <= len(adapter_list):
152
+ adapter_name = adapter_list[idx - 1][0]
153
+ selected_packages.append(adapter_name)
154
+ console.print(f"[green]已选择: {adapter_name}[/]")
155
+ else:
156
+ console.print(f"[red]无效的序号: {idx}[/]")
157
+
158
+ if selected_packages:
159
+ # 确认安装
160
+ if Confirm.ask(
161
+ f"\n[cyan]确认安装以下 {len(selected_packages)} 个适配器吗?[/cyan]",
162
+ default=True
163
+ ):
164
+ self.package_manager.install_package(selected_packages, upgrade=upgrade, pre=pre)
165
+
166
+ except ValueError:
167
+ console.print("[red]输入格式错误,请输入数字序号[/]")
168
+
169
+ def _install_modules(self, remote_packages: dict, upgrade: bool, pre: bool):
170
+ """安装模块"""
171
+ console.print("\n[bold]可用的模块:[/bold]")
172
+
173
+ modules = remote_packages.get("modules", {})
174
+
175
+ if not modules:
176
+ console.print("[yellow]没有可用的模块[/yellow]")
177
+ return
178
+
179
+ # 显示模块列表
180
+ table = Table(box=SIMPLE, header_style="module")
181
+ table.add_column("序号", style="cyan")
182
+ table.add_column("模块名", style="module")
183
+ table.add_column("包名")
184
+ table.add_column("描述")
185
+
186
+ module_list = list(modules.items())
187
+ for i, (name, info) in enumerate(module_list, 1):
188
+ table.add_row(
189
+ str(i),
190
+ name,
191
+ info.get("package", ""),
192
+ info.get("description", "")
193
+ )
194
+
195
+ console.print(table)
196
+
197
+ # 选择模块
198
+ selected = Prompt.ask(
199
+ "\n[cyan]请输入要安装的模块序号(多个用逗号分隔,如: 1,3)或按 q 返回:[/cyan]"
200
+ )
201
+
202
+ if selected.lower() == 'q':
203
+ return
204
+
205
+ try:
206
+ indices = [int(idx.strip()) for idx in selected.split(",")]
207
+ selected_packages = []
208
+
209
+ for idx in indices:
210
+ if 1 <= idx <= len(module_list):
211
+ module_name = module_list[idx - 1][0]
212
+ selected_packages.append(module_name)
213
+ console.print(f"[green]已选择: {module_name}[/]")
214
+ else:
215
+ console.print(f"[red]无效的序号: {idx}[/]")
216
+
217
+ if selected_packages:
218
+ # 确认安装
219
+ if Confirm.ask(
220
+ f"\n[cyan]确认安装以下 {len(selected_packages)} 个模块吗?[/cyan]",
221
+ default=True
222
+ ):
223
+ self.package_manager.install_package(selected_packages, upgrade=upgrade, pre=pre)
224
+
225
+ except ValueError:
226
+ console.print("[red]输入格式错误,请输入数字序号[/]")
227
+
228
+ def _install_cli_extensions(self, remote_packages: dict, upgrade: bool, pre: bool):
229
+ """安装 CLI 扩展"""
230
+ console.print("\n[bold]可用的 CLI 扩展:[/bold]")
231
+
232
+ cli_extensions = remote_packages.get("cli_extensions", {})
233
+
234
+ if not cli_extensions:
235
+ console.print("[yellow]没有可用的 CLI 扩展[/yellow]")
236
+ return
237
+
238
+ # 显示 CLI 扩展列表
239
+ table = Table(box=SIMPLE, header_style="cli")
240
+ table.add_column("序号", style="cyan")
241
+ table.add_column("命令名", style="cli")
242
+ table.add_column("包名")
243
+ table.add_column("描述")
244
+
245
+ cli_list = list(cli_extensions.items())
246
+ for i, (name, info) in enumerate(cli_list, 1):
247
+ table.add_row(
248
+ str(i),
249
+ name,
250
+ info.get("package", ""),
251
+ info.get("description", "")
252
+ )
253
+
254
+ console.print(table)
255
+
256
+ # 选择 CLI 扩展
257
+ selected = Prompt.ask(
258
+ "\n[cyan]请输入要安装的 CLI 扩展序号(多个用逗号分隔,如: 1,3)或按 q 返回:[/cyan]"
259
+ )
260
+
261
+ if selected.lower() == 'q':
262
+ return
263
+
264
+ try:
265
+ indices = [int(idx.strip()) for idx in selected.split(",")]
266
+ selected_packages = []
267
+
268
+ for idx in indices:
269
+ if 1 <= idx <= len(cli_list):
270
+ cli_name = cli_list[idx - 1][0]
271
+ selected_packages.append(cli_name)
272
+ console.print(f"[green]已选择: {cli_name}[/]")
273
+ else:
274
+ console.print(f"[red]无效的序号: {idx}[/]")
275
+
276
+ if selected_packages:
277
+ # 确认安装
278
+ if Confirm.ask(
279
+ f"\n[cyan]确认安装以下 {len(selected_packages)} 个 CLI 扩展吗?[/cyan]",
280
+ default=True
281
+ ):
282
+ self.package_manager.install_package(selected_packages, upgrade=upgrade, pre=pre)
283
+
284
+ except ValueError:
285
+ console.print("[red]输入格式错误,请输入数字序号[/]")
286
+
287
+ def _install_custom(self, upgrade: bool, pre: bool):
288
+ """自定义安装"""
289
+ package_name = Prompt.ask(
290
+ "\n[cyan]请输入要安装的包名(或按 q 返回):[/cyan]"
291
+ )
292
+
293
+ if package_name.lower() == 'q':
294
+ return
295
+
296
+ if package_name:
297
+ # 确认安装
298
+ if Confirm.ask(
299
+ f"\n[cyan]确认安装包 {package_name} 吗?[/cyan]",
300
+ default=True
301
+ ):
302
+ self.package_manager.install_package([package_name], upgrade=upgrade, pre=pre)
@@ -0,0 +1,58 @@
1
+ # type: ignore
2
+ #
3
+ # Auto-generated type stub for install.py
4
+ # DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
5
+ #
6
+
7
+ """
8
+ Install 命令实现
9
+
10
+ 支持交互式和批量安装模块、适配器、CLI 扩展
11
+ """
12
+
13
+ import sys
14
+ import asyncio
15
+ from argparse import ArgumentParser
16
+ from rich.panel import Panel
17
+ from rich.prompt import Confirm, Prompt
18
+ from rich.table import Table
19
+ from rich.box import SIMPLE
20
+ from ..utils import PackageManager
21
+ from ..console import console
22
+ from ..base import Command
23
+
24
+ class InstallCommand(Command):
25
+ def __init__(self: None) -> ...:
26
+ ...
27
+ def add_arguments(self: object, parser: ArgumentParser) -> ...:
28
+ ...
29
+ def execute(self: object, args: ...) -> ...:
30
+ ...
31
+ def _interactive_install(self: object, upgrade: bool = ..., pre: bool = ...) -> ...:
32
+ """
33
+ 交互式安装界面
34
+
35
+ :param upgrade: 是否升级模式
36
+ :param pre: 是否包含预发布版本
37
+ """
38
+ ...
39
+ def _install_adapters(self: object, remote_packages: dict, upgrade: bool, pre: bool) -> ...:
40
+ """
41
+ 安装适配器
42
+ """
43
+ ...
44
+ def _install_modules(self: object, remote_packages: dict, upgrade: bool, pre: bool) -> ...:
45
+ """
46
+ 安装模块
47
+ """
48
+ ...
49
+ def _install_cli_extensions(self: object, remote_packages: dict, upgrade: bool, pre: bool) -> ...:
50
+ """
51
+ 安装 CLI 扩展
52
+ """
53
+ ...
54
+ def _install_custom(self: object, upgrade: bool, pre: bool) -> ...:
55
+ """
56
+ 自定义安装
57
+ """
58
+ ...
@@ -0,0 +1,160 @@
1
+ """
2
+ List 命令实现
3
+
4
+ 列出已安装的组件
5
+ """
6
+
7
+ import asyncio
8
+ from argparse import ArgumentParser
9
+
10
+ from rich.table import Table
11
+ from rich.box import SIMPLE
12
+
13
+ from ..utils import PackageManager
14
+ from ..console import console
15
+ from ..base import Command
16
+
17
+
18
+ class ListCommand(Command):
19
+ name = "list"
20
+ description = "列出已安装的组件"
21
+
22
+ def __init__(self):
23
+ self.package_manager = PackageManager()
24
+
25
+ def add_arguments(self, parser: ArgumentParser):
26
+ parser.add_argument(
27
+ '--type', '-t',
28
+ choices=['modules', 'adapters', 'cli', 'all'],
29
+ default='all',
30
+ help='列出类型 (默认: all)'
31
+ )
32
+ parser.add_argument(
33
+ '--outdated', '-o',
34
+ action='store_true',
35
+ help='仅显示可升级的包'
36
+ )
37
+
38
+ def execute(self, args):
39
+ pkg_type = args.type
40
+ outdated_only = args.outdated
41
+
42
+ if pkg_type == "all":
43
+ self._print_installed_packages("modules", outdated_only)
44
+ self._print_installed_packages("adapters", outdated_only)
45
+ self._print_installed_packages("cli", outdated_only)
46
+ else:
47
+ self._print_installed_packages(pkg_type, outdated_only)
48
+
49
+ def _print_installed_packages(self, pkg_type: str, outdated_only: bool = False):
50
+ """
51
+ 打印已安装包信息
52
+
53
+ :param pkg_type: 包类型 (modules/adapters/cli)
54
+ :param outdated_only: 是否只显示可升级的包
55
+ """
56
+ installed = self.package_manager.get_installed_packages()
57
+
58
+ if pkg_type == "modules" and installed["modules"]:
59
+ table = Table(
60
+ title="已安装模块",
61
+ box=SIMPLE,
62
+ header_style="module"
63
+ )
64
+ table.add_column("模块名", style="module")
65
+ table.add_column("包名")
66
+ table.add_column("版本")
67
+ table.add_column("状态")
68
+ table.add_column("描述")
69
+
70
+ for name, info in installed["modules"].items():
71
+ if outdated_only and not self._is_package_outdated(info["package"], info["version"]):
72
+ continue
73
+
74
+ status = "[green]已启用[/]" if info.get("enabled", True) else "[yellow]已禁用[/]"
75
+ table.add_row(
76
+ name,
77
+ info["package"],
78
+ info["version"],
79
+ status,
80
+ info["summary"]
81
+ )
82
+
83
+ console.print(table)
84
+
85
+ elif pkg_type == "adapters" and installed["adapters"]:
86
+ table = Table(
87
+ title="已安装适配器",
88
+ box=SIMPLE,
89
+ header_style="adapter"
90
+ )
91
+ table.add_column("适配器名", style="adapter")
92
+ table.add_column("包名")
93
+ table.add_column("版本")
94
+ table.add_column("描述")
95
+
96
+ for name, info in installed["adapters"].items():
97
+ if outdated_only and not self._is_package_outdated(info["package"], info["version"]):
98
+ continue
99
+
100
+ table.add_row(
101
+ name,
102
+ info["package"],
103
+ info["version"],
104
+ info["summary"]
105
+ )
106
+
107
+ console.print(table)
108
+
109
+ elif pkg_type == "cli" and installed["cli_extensions"]:
110
+ table = Table(
111
+ title="已安装CLI扩展",
112
+ box=SIMPLE,
113
+ header_style="cli"
114
+ )
115
+ table.add_column("命令名", style="cli")
116
+ table.add_column("包名")
117
+ table.add_column("版本")
118
+ table.add_column("描述")
119
+
120
+ for name, info in installed["cli_extensions"].items():
121
+ if outdated_only and not self._is_package_outdated(info["package"], info["version"]):
122
+ continue
123
+
124
+ table.add_row(
125
+ name,
126
+ info["package"],
127
+ info["version"],
128
+ info["summary"]
129
+ )
130
+
131
+ console.print(table)
132
+ elif not installed.get(pkg_type.replace("cli", "cli_extensions"), {}):
133
+ pass
134
+
135
+ def _is_package_outdated(self, package_name: str, current_version: str) -> bool:
136
+ """
137
+ 检查包是否过时
138
+
139
+ :param package_name: 包名
140
+ :param current_version: 当前版本
141
+ :return: 是否有新版本可用
142
+ """
143
+ remote_packages = asyncio.run(self.package_manager.get_remote_packages())
144
+
145
+ # 检查模块
146
+ for module_info in remote_packages["modules"].values():
147
+ if module_info["package"] == package_name:
148
+ return module_info["version"] != current_version
149
+
150
+ # 检查适配器
151
+ for adapter_info in remote_packages["adapters"].values():
152
+ if adapter_info["package"] == package_name:
153
+ return adapter_info["version"] != current_version
154
+
155
+ # 检查CLI扩展
156
+ for cli_info in remote_packages.get("cli_extensions", {}).values():
157
+ if cli_info["package"] == package_name:
158
+ return cli_info["version"] != current_version
159
+
160
+ return False
@@ -0,0 +1,44 @@
1
+ # type: ignore
2
+ #
3
+ # Auto-generated type stub for list.py
4
+ # DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
5
+ #
6
+
7
+ """
8
+ List 命令实现
9
+
10
+ 列出已安装的组件
11
+ """
12
+
13
+ import asyncio
14
+ from argparse import ArgumentParser
15
+ from rich.table import Table
16
+ from rich.box import SIMPLE
17
+ from ..utils import PackageManager
18
+ from ..console import console
19
+ from ..base import Command
20
+
21
+ class ListCommand(Command):
22
+ def __init__(self: None) -> ...:
23
+ ...
24
+ def add_arguments(self: object, parser: ArgumentParser) -> ...:
25
+ ...
26
+ def execute(self: object, args: ...) -> ...:
27
+ ...
28
+ def _print_installed_packages(self: object, pkg_type: str, outdated_only: bool = ...) -> ...:
29
+ """
30
+ 打印已安装包信息
31
+
32
+ :param pkg_type: 包类型 (modules/adapters/cli)
33
+ :param outdated_only: 是否只显示可升级的包
34
+ """
35
+ ...
36
+ def _is_package_outdated(self: object, package_name: str, current_version: str) -> bool:
37
+ """
38
+ 检查包是否过时
39
+
40
+ :param package_name: 包名
41
+ :param current_version: 当前版本
42
+ :return: 是否有新版本可用
43
+ """
44
+ ...
@@ -0,0 +1,123 @@
1
+ """
2
+ List-Remote 命令实现
3
+
4
+ 列出远程可用的组件
5
+ """
6
+
7
+ import asyncio
8
+ from argparse import ArgumentParser
9
+
10
+ from rich.table import Table
11
+ from rich.box import SIMPLE
12
+
13
+ from ..utils import PackageManager
14
+ from ..console import console
15
+ from ..base import Command
16
+
17
+
18
+ class ListRemoteCommand(Command):
19
+ name = "list-remote"
20
+ description = "列出远程可用的组件"
21
+
22
+ def __init__(self):
23
+ self.package_manager = PackageManager()
24
+
25
+ def add_arguments(self, parser: ArgumentParser):
26
+ parser.add_argument(
27
+ '--type', '-t',
28
+ choices=['modules', 'adapters', 'cli', 'all'],
29
+ default='all',
30
+ help='列出类型 (默认: all)'
31
+ )
32
+ parser.add_argument(
33
+ '--refresh', '-r',
34
+ action='store_true',
35
+ help='强制刷新远程包列表'
36
+ )
37
+
38
+ def execute(self, args):
39
+ pkg_type = args.type
40
+ force_refresh = args.refresh
41
+
42
+ if pkg_type == "all":
43
+ self._print_remote_packages("modules", force_refresh)
44
+ self._print_remote_packages("adapters", force_refresh)
45
+ self._print_remote_packages("cli", force_refresh)
46
+ else:
47
+ self._print_remote_packages(pkg_type, force_refresh)
48
+
49
+ def _print_remote_packages(self, pkg_type: str, force_refresh: bool = False):
50
+ """
51
+ 打印远程包信息
52
+
53
+ :param pkg_type: 包类型 (modules/adapters/cli)
54
+ :param force_refresh: 是否强制刷新缓存
55
+ """
56
+ remote_packages = asyncio.run(
57
+ self.package_manager.get_remote_packages(force_refresh=force_refresh)
58
+ )
59
+
60
+ if pkg_type == "modules" and remote_packages["modules"]:
61
+ table = Table(
62
+ title="远程模块",
63
+ box=SIMPLE,
64
+ header_style="module"
65
+ )
66
+ table.add_column("模块名", style="module")
67
+ table.add_column("包名")
68
+ table.add_column("最新版本")
69
+ table.add_column("描述")
70
+
71
+ for name, info in remote_packages["modules"].items():
72
+ table.add_row(
73
+ name,
74
+ info["package"],
75
+ info["version"],
76
+ info.get("description", "")
77
+ )
78
+
79
+ console.print(table)
80
+
81
+ elif pkg_type == "adapters" and remote_packages["adapters"]:
82
+ table = Table(
83
+ title="远程适配器",
84
+ box=SIMPLE,
85
+ header_style="adapter"
86
+ )
87
+ table.add_column("适配器名", style="adapter")
88
+ table.add_column("包名")
89
+ table.add_column("最新版本")
90
+ table.add_column("描述")
91
+
92
+ for name, info in remote_packages["adapters"].items():
93
+ table.add_row(
94
+ name,
95
+ info["package"],
96
+ info["version"],
97
+ info.get("description", "")
98
+ )
99
+
100
+ console.print(table)
101
+
102
+ elif pkg_type == "cli" and remote_packages.get("cli_extensions"):
103
+ table = Table(
104
+ title="远程CLI扩展",
105
+ box=SIMPLE,
106
+ header_style="cli"
107
+ )
108
+ table.add_column("命令名", style="cli")
109
+ table.add_column("包名")
110
+ table.add_column("最新版本")
111
+ table.add_column("描述")
112
+
113
+ for name, info in remote_packages["cli_extensions"].items():
114
+ table.add_row(
115
+ name,
116
+ info["package"],
117
+ info["version"],
118
+ info.get("description", "")
119
+ )
120
+
121
+ console.print(table)
122
+ elif not remote_packages.get(pkg_type.replace("cli", "cli_extensions"), {}):
123
+ console.print(f"[dim]远程没有找到 {pkg_type}[/]")