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