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.
- ErisPulse/CLI/__init__.py +11 -0
- ErisPulse/CLI/__init__.pyi +13 -0
- ErisPulse/CLI/base.py +52 -0
- ErisPulse/CLI/base.pyi +50 -0
- ErisPulse/CLI/cli.py +224 -0
- ErisPulse/CLI/cli.pyi +80 -0
- ErisPulse/CLI/commands/__init__.py +6 -0
- ErisPulse/CLI/commands/__init__.pyi +12 -0
- ErisPulse/CLI/commands/init.py +395 -0
- ErisPulse/CLI/commands/init.pyi +70 -0
- ErisPulse/CLI/commands/install.py +302 -0
- ErisPulse/CLI/commands/install.pyi +58 -0
- ErisPulse/CLI/commands/list.py +160 -0
- ErisPulse/CLI/commands/list.pyi +44 -0
- ErisPulse/CLI/commands/list_remote.py +123 -0
- ErisPulse/CLI/commands/list_remote.pyi +35 -0
- ErisPulse/CLI/commands/run.py +108 -0
- ErisPulse/CLI/commands/run.pyi +39 -0
- ErisPulse/CLI/commands/self_update.py +232 -0
- ErisPulse/CLI/commands/self_update.pyi +47 -0
- ErisPulse/CLI/commands/uninstall.py +32 -0
- ErisPulse/CLI/commands/uninstall.pyi +24 -0
- ErisPulse/CLI/commands/upgrade.py +56 -0
- ErisPulse/CLI/commands/upgrade.pyi +25 -0
- ErisPulse/CLI/console.pyi +20 -0
- ErisPulse/CLI/registry.py +112 -0
- ErisPulse/CLI/registry.pyi +99 -0
- ErisPulse/{utils → CLI/utils}/__init__.py +2 -6
- ErisPulse/CLI/utils/__init__.pyi +14 -0
- ErisPulse/{utils → CLI/utils}/package_manager.py +146 -20
- ErisPulse/CLI/utils/package_manager.pyi +241 -0
- ErisPulse/{utils → CLI/utils}/reload_handler.py +7 -8
- ErisPulse/CLI/utils/reload_handler.pyi +64 -0
- ErisPulse/Core/Bases/__init__.pyi +14 -0
- ErisPulse/Core/Bases/adapter.py +13 -1
- ErisPulse/Core/Bases/adapter.pyi +140 -0
- ErisPulse/Core/Bases/manager.py +136 -0
- ErisPulse/Core/Bases/manager.pyi +108 -0
- ErisPulse/Core/Bases/module.py +53 -1
- ErisPulse/Core/Bases/module.pyi +95 -0
- ErisPulse/Core/Event/__init__.pyi +26 -0
- ErisPulse/Core/Event/base.pyi +62 -0
- ErisPulse/Core/Event/command.py +6 -1
- ErisPulse/Core/Event/command.pyi +113 -0
- ErisPulse/Core/Event/exceptions.pyi +43 -0
- ErisPulse/Core/Event/message.pyi +93 -0
- ErisPulse/Core/Event/meta.pyi +92 -0
- ErisPulse/Core/Event/notice.pyi +108 -0
- ErisPulse/Core/Event/request.pyi +76 -0
- ErisPulse/Core/Event/wrapper.py +2 -3
- ErisPulse/Core/Event/wrapper.pyi +403 -0
- ErisPulse/Core/__init__.py +16 -13
- ErisPulse/Core/__init__.pyi +16 -0
- ErisPulse/Core/_self_config.py +1 -1
- ErisPulse/Core/_self_config.pyi +72 -0
- ErisPulse/Core/adapter.py +70 -10
- ErisPulse/Core/adapter.pyi +246 -0
- ErisPulse/Core/config.pyi +70 -0
- ErisPulse/Core/exceptions.py +4 -2
- ErisPulse/Core/exceptions.pyi +60 -0
- ErisPulse/Core/lifecycle.py +15 -1
- ErisPulse/Core/lifecycle.pyi +92 -0
- ErisPulse/Core/logger.py +21 -15
- ErisPulse/Core/logger.pyi +169 -0
- ErisPulse/Core/module.py +57 -9
- ErisPulse/Core/module.pyi +189 -0
- ErisPulse/Core/router.py +13 -5
- ErisPulse/Core/router.pyi +120 -0
- ErisPulse/Core/storage.py +94 -256
- ErisPulse/Core/storage.pyi +220 -0
- ErisPulse/__init__.py +35 -1236
- ErisPulse/__init__.pyi +22 -0
- ErisPulse/__main__.py +1 -1
- ErisPulse/__main__.pyi +24 -0
- ErisPulse/loaders/__init__.py +22 -0
- ErisPulse/loaders/__init__.pyi +21 -0
- ErisPulse/loaders/adapter_loader.py +187 -0
- ErisPulse/loaders/adapter_loader.pyi +82 -0
- ErisPulse/loaders/base_loader.py +162 -0
- ErisPulse/loaders/base_loader.pyi +23 -0
- ErisPulse/loaders/initializer.py +150 -0
- ErisPulse/loaders/initializer.pyi +60 -0
- ErisPulse/loaders/module_loader.py +618 -0
- ErisPulse/loaders/module_loader.pyi +179 -0
- ErisPulse/loaders/strategy.py +129 -0
- ErisPulse/loaders/strategy.pyi +90 -0
- ErisPulse/sdk.py +435 -0
- ErisPulse/sdk.pyi +158 -0
- {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/METADATA +6 -20
- erispulse-2.3.4.dev2.dist-info/RECORD +103 -0
- {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/licenses/LICENSE +3 -3
- ErisPulse/Core/ux.py +0 -635
- ErisPulse/utils/cli.py +0 -1097
- erispulse-2.3.3.dev0.dist-info/RECORD +0 -35
- /ErisPulse/{utils → CLI}/console.py +0 -0
- {erispulse-2.3.3.dev0.dist-info → erispulse-2.3.4.dev2.dist-info}/WHEEL +0 -0
- {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}[/]")
|